Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL选择名称按字母分组限制为每个字母n个结果_Php_Mysql_Sql - Fatal编程技术网

Php MySQL选择名称按字母分组限制为每个字母n个结果

Php MySQL选择名称按字母分组限制为每个字母n个结果,php,mysql,sql,Php,Mysql,Sql,我想创建一个查询,从一个表中获取名称,然后将其与其他表合并,按字母表中每个字母的字母顺序排列,然后在一个查询中限制每个字母的结果为n 因此,我不想对每个字母运行26个查询,比如: SELECT CONCAT_WS(' ',first_name,last_name) AS name FROM encyclopedia WHERE name LIKE "A%" ORDER BY rand() LIMIT 4 SELECT CONCAT_WS(' ',first_name,last_name) AS

我想创建一个查询,从一个表中获取名称,然后将其与其他表合并,按字母表中每个字母的字母顺序排列,然后在一个查询中限制每个字母的结果为n

因此,我不想对每个字母运行26个查询,比如:

SELECT CONCAT_WS(' ',first_name,last_name) AS name FROM encyclopedia WHERE name LIKE "A%" ORDER BY rand() LIMIT 4 
SELECT CONCAT_WS(' ',first_name,last_name) AS name FROM encyclopedia WHERE name LIKE "B%" ORDER BY rand() LIMIT 4 
SELECT CONCAT_WS(' ',first_name,last_name) AS name FROM encyclopedia WHERE name LIKE "C%" ORDER BY rand() LIMIT 4
现在我有:

SELECT 
      e.id,
      CONCAT_WS(' ',first_name,last_name) AS name,
      sg.name AS sub_name, 
      sg.id AS sub_id 
      FROM ( SELECT id,first_name,last_name FROM encyclopedia ORDER BY RAND() LIMIT 4) AS e
      LEFT JOIN encyclopedia_subgenres esub
      ON ( e.id = esub.enc_id )
      LEFT JOIN subgenres sg
      ON ( esub.subgenre_id = sg.id )
      ORDER BY name
然后,我从php中根据结果创建数组:

    Array
(
    [b] => Array
        (
            [2] => Array
                (
                    [name] => B Style
                    [genres] => Array
                        (
                            [26] => Classic
                            [27] => X
                            [29] => Y
                        )

                )

            [7] => Array
                (
                    [name] => Beyonce Giselle Knowles
                    [genres] => Array
                        (
                            [32] => Pop
                        )

                )

        )

    [i] => Array
        (
            [1] => Array
                (
                    [name] => Ivan D
                    [genres] => Array
                        (
                            [27] => R&B
                            [2] => Jazz
                        )

                )

        )

    [m] => Array
        (
            [3] => Array
                (
                    [name] => Maria T
                    [genres] => Array
                        (
                            [26] => Classical
                            [27] => Pop
                            [28] => Dance
                        )

                )

        )

)
但问题是,它限制了我只有4个随机结果,可以是4个在同一个字母或任何组合上。 有办法做到这一点吗


谢谢。

我认为sql没有那么灵活,但我不确定。您必须为此编写存储过程

首先创建一个生成此序列的序列:A,B,C,…,Z,A,B,C,…,Z,A,B,C。。。 让我们称之为魔术序列

然后创建一个临时表,其中一列init从magic sequence中播种,另一列count_down等于4。它应该有26行。让我们称之为init_table

然后编写另一个函数,即验收测试

- take a string S with
- decrease count_down of the corresponding row in init_table
- return true if count_down > = 0; otherwise false
现在有这样一个查询:

SELECT CONCAT_WS(' ',first_name,last_name) AS name FROM encyclopedia WHERE acceptance_test(name) LIMIT 4*26
如果你愿意,你也必须随机化