私はIN()で使用する値のリストを作成するのに "group_concat"を使用しようとしていましたが、カンマ区切りの一重引用符で囲まれた値文字列を慎重に作成しても機能しません。 group_concatの表示される値が 'de'、 'es'、 'fr'であっても、1つのレコードの結果セットが間違って返されたとしても、group_concat'edリストで "fr"を見つけられません。以下一方MySQL - IN()文でgroup_concatを使用できますか?
SELECT Message, table_id FROM Tenant
LEFT JOIN Translation on Translation.table_id=Tenant.ID
WHERE table_name='Tenant' AND table_column='Message' AND Tenant.ID=2
GROUP BY table_name, table_column, table_id HAVING 'fr' NOT
IN(group_concat(CONCAT('''', language, '''')));
、 "FR" は、実際に見出され、結果セットを適切に空である:
SELECT Message, table_id FROM Tenant
LEFT JOIN Translation on Translation.table_id=Tenant.ID
WHERE table_name='Tenant' AND table_column='Message' AND Tenant.ID=2
GROUP BY table_name, table_column, table_id HAVING 'fr' NOT IN('de','es','fr')
私は(LOCATE使用することができ実現)。
SELECT Message, table_id FROM Tenant
LEFT JOIN Translation on Translation.table_id=Tenant.ID
WHERE table_name='Tenant' AND table_column='Message' AND Tenant.ID=2
GROUP BY table_name, table_column, table_id HAVING LOCATE('de',
group_concat(language)) = 0
しかし、このようなテキスト検索は、おそらくMySQLのオプティマイザによって異なり予定されている「IN()」に比べておそらくあまり効率的です。
私は気付いている(キャスト()、リストを再構成しようとする)などのトリックを試しましたが、私は新鮮です。私はこれがgroup_concatの限界か、おそらくMySQLコンパイラの "バグ"さえあるのかどうかはわかりません。誰かが良いアイデアを持っているなら、私は最も感謝しています。あなたはフランス語の文字列をチェックするために、あなたのHAVING
句で条件付きの集約を使用する必要があります
おかげ
この全体的なアプローチは私には戸惑うが、https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-toを参照してください。 -be-a-very-simple-sql-query – Strawberry