0

これは私がかなり長い間頭を悩ませてきたクエリであり、完全に機能させることができたことがなく、約 40 時間熟考した後、この時点に到達しました。

設定

この問題の例では、2 つのテーブルがあり、1 つは...

field_site_id             field_sitename           field_admins
1                         Some Site                1,
2                         Other Site               1,2,

そしてもう1つは管理者のようなものです...

field_user_id             field_firstname          field_lastname
1                         Joe                      Bloggs
2                         Barry                    Wills

このクエリが実行するように設計されているのは、次のとおりです。

  • データベース内のすべてのサイトを一覧表示する
  • JOIN と FIND_IN_SET を使用して各管理者をプルする
    • そして GROUP_CONCAT(field_firstname, ' ', field_lastname) に GROUP BY を指定して、実際のユーザー名でフィールドを作成します。
  • また、HAVING でカスタム結果をフィルタリングして、結果をさらに絞り込むこともできます。

この部分はすべて完全に正常に機能します。

私が達成する方法を理解できないのは、GROUP_CONCAT の結果で結果をソートすることです。これは、concat 関数の前に ORDER BY が機能しているため、並べ替えるデータが存在しないため、代替手段は何でしょうかなれ?

コード例:

SELECT *

GROUP_CONCAT(DISTINCT field_firstname, ' ', field_lastname ORDER BY field_lastname SEPARATOR ', ') AS field_admins_fullname,

FROM `table_sites`
LEFT JOIN `table_admins` ON FIND_IN_SET( `table_admins`.`field_user_id`, `table_sites`.`field_site_id` ) > 0
GROUP BY field_site_id

以下のように、サブクエリを使用して group_concat の結果を収集するクエリも試しました...

( SELECT GROUP_CONCAT(field_firstname, ' ', field_lastname ORDER BY field_lastname ASC SEPARATOR ', ') FROM table_admins 
WHERE FIND_IN_SET( `table_admins`.`field_user_id`, `table_sites`.`field_admins` ) > 0
) AS field_admins_fullname

結論

どちらの方法で ORDER BY field_admins_fullname を試行しても正しい結果は作成されません。エラーは発生しませんが、指定された ORDER BY が空白であるため、必要なことは何でも実行すると想定します。

これが不可能な場合、別の推奨インデックス方法論は何ですか?

4

3 に答える 3

1

CONCAT内で選択している複雑なステートメントを繰り返す必要があると思いますORDER BY

だからあなたの注文はもっと似ているでしょう...

ORDER BY (GROUP_CONCAT(DISTINCT field_firstname, ' ',
    field_lastname ORDER BY field_lastname SEPARATOR ', ')) ASC

私はこれを試していませんが、これで解決したように見える同様の問題がありましたが、DISTINCTその他がなければはるかに簡単でした.

于 2011-06-11T22:22:54.620 に答える
0

間違ったグループ化、これを試してみませんか?

GROUP BY field_site_id
于 2011-02-19T13:33:08.637 に答える