これは私がかなり長い間頭を悩ませてきたクエリであり、完全に機能させることができたことがなく、約 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 が空白であるため、必要なことは何でも実行すると想定します。
これが不可能な場合、別の推奨インデックス方法論は何ですか?