2017-09-05 8 views
0

私は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句で条件付きの集約を使用する必要があります

おかげ

+0

この全体的なアプローチは私には戸惑うが、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

答えて

1

:指定したので、私は、GROUP BYリストからtable_nametable_columnを削除

SELECT 
    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_id 
HAVING SUM(CASE WHEN language = 'fr' THEN 1 ELSE 0 END) = 0 

注意WHERE句のこれらの列の固定値。また、リストからMessageを削除しました。これはグループによって表示されないためです。また、集計関数内にもありません。オリジナルのクエリは、特定のバージョンのMySQLや他のほとんどのデータベースでも実行されません。

+0

優れた思考Tim。応答していただきありがとうございます。私はちょうどそれを試み、それは働いた。私はパフォーマンスに関するあなたの考えに興味があります。あなたが提示した条件付きサンプルは、0.0017秒で実行されました。ここでは、「ロケート」は0.00084秒しかかかりませんでした。条件付きで最終的に「端末速度」にぶつかるか、それともそれに比例して上昇するか? – rotor155

+0

完全な答えを出すために完全な 'EXPLAIN'を勉強しなければならないでしょうが、直感的には、MySQLは常に各table_idグループをチェックしてフランス語がどこにも現れないようにする必要があります。そして、これはおそらく直線的ではないテーブルのサイズに比例するはずですが、ペナルティはサイズが大きくなると大きくなるはずです。 –

+0

ああ、私はあなたがすでにWHERE句でそれらを持っていたことに気付いたように、私がそのGROUP BYで何を考えているのか分かりません。もう一度ありがとう... – rotor155

関連する問題