1

次の問題があります。ユーザーが行ったすべての投票を選択して、1 つの列にまとめようとしています。私はGROUP_CONCATこれに使用しますが、どういうわけか値の順序が混在しています。

これは SQL コードです。

SELECT 
    GROUP_CONCAT(DISTINCT options.option_name 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

投票の値の例は次のとおりです。

id |  event_id  | question_id  |  selected   |  user_id
25       14           42          52,46,41         1
26       14           43             68            1

オプションは次のようなものです:

id |  option_name   | question_id
 40        Project A          42
 41        Project B          42
 46        Project C          42     
 52        Project D          42
 67        Hello              43
 68        Bye                43

質問は次のようなものです:

id  |  question_name  | event_id
42     Project Number       14
43     Greeting             14

イベントは次のようなものです:

id  |  title
14     Project Testing

指定されたコードの出力は次のとおりです。

selected                            |  event_title
Project C, Bye, ProjectD, Project B      Test

プロジェクト D、プロジェクト C、プロジェクト B、バイのように出力されるように、元の順序を維持するにはどうすればよいですか?

4

1 に答える 1

1

このようなものは機能しますか?基本的に、フィールド値で並べ替えて、「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
于 2014-07-26T14:53:56.220 に答える