sql >> データベース >  >> RDS >> Mysql

MYSQL-GROUP_CONCATとFIND_IN_SETは値/順序を混合していますか?

    この作品のようなものはありますか?基本的には、フィールド値で並べ替えて、「52」、「46」などのように表示します。

    SELECT 
        GROUP_CONCAT(DISTINCT options.option_name 
                     ORDER BY FIELD( options.id, 
                                     concat('"', 
                                            replace(selected, ',', '","'),
                                            '"') 
                                   ) 
                     SEPARATOR ','
                    ) AS selected,
        user_login.firstname, user_login.lastname,
        event.event_title
    FROM options, user_login, event, votes, questions
    WHERE event.id = ? AND questions.Event_id = event.id 
      AND votes.user_id = user_login.id AND votes.question_id = questions.id 
      AND FIND_IN_SET(options.id, selected)
    GROUP BY user_login.id
    ORDER BY user_login.class
    

    編集:

    これを行うための私の好ましい方法は、文字列を持つ変数を作成することです。読みやすく、この方法で正しい順序で実行されることを確認できます。

    SET @order_field := (
        SELECT 
            group_concat(
                CONCAT('"', replace(selected, ',', '","'), '"')
            ) 
        FROM votes);
    

    そうすれば、クエリははるかに読みやすくなります...

    SELECT 
        GROUP_CONCAT(DISTINCT options.option_name 
                     ORDER BY FIELD( options.id, @order_field) 
                     SEPARATOR ','
                    ) AS selected,
        user_login.firstname, user_login.lastname,
        event.event_title
    FROM options, user_login, event, votes, questions
    WHERE event.id = ? AND questions.Event_id = event.id 
      AND votes.user_id = user_login.id AND votes.question_id = questions.id 
      AND FIND_IN_SET(options.id, selected)
    GROUP BY user_login.id
    ORDER BY user_login.class
    



    1. MySQLは内部結合から1行を選択します

    2. データベースの列からコンマ区切りのドロップダウン値を表示する

    3. MySQLブロブを確実に復元する方法

    4. 親子フォームの順序なしリストphpで階層データを印刷しますか?