簡體   English   中英

MySQL選擇名稱按字母分組,每個字母n個結果

[英]MySQL select names group by alphabet limit to n results per letter

我想創建一個查詢,該查詢將從一個表中獲取名稱,然后將其與其他表合並,按字母順序對字母的每個字母排序,然后在一個查詢中將每個字母的結果限制為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,...讓我們稱其為magic_sequence。

然后創建一個臨時表,該表具有一列init,該列是從魔術序列開始的,另一列count_down等於4。它應該有26行。 我們稱它為init_table;

然后寫另一個函數,acceptance_test

- 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

如果需要,還必須隨機化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM