私を夢中にさせているクエリを作成しようとしています。どこから解決すればよいのかわかりませんでしたが、少し調べた後、サブクエリで遊んでみました。今、それが私の問題を解決するかどうか、または解決する場合は、私が望むものを作成する方法がわからないところまで来ています。
これは、現在のテーブルの非常に単純なビューです (tbl_1 と呼びます)。
---------------------------------
| row | name | other_names |
|-------------------------------|
| 1 | A | B, C |
| 2 | B | C |
| 3 | A | C |
| 4 | D | E |
| 5 | C | A, B |
---------------------------------
私が扱っているアイテムの中には複数の名前 (ブランド名、他の国での名前、コードネームなど) を持つものがありますが、最終的にはそれらの異なる名前はすべて同じアイテムを指しています。私はもともと、次の行に沿って検索クエリを実行していました。
SELECT * FROM tbl_1
WHERE name LIKE '%A%'
OR other_names LIKE '%A%';
どちらが行 1 と行 3 を返します。しかし、A = B = C として、クエリは行 2 も返す必要があることにすぐに気付きました。すべての名前を何らかの方法で 1 つの行に結合する別のテーブルを構築するなど、派手なクエリ以外の代替提案を受け入れますが、そのようなものはエラーが発生しやすく、非効率的であると考えています。
さらに、InnoDB を使用して MySQL 5.5.23 を実行し、PHP と Python で記述された他のコードを使用しています。
ありがとう!
2012 年 5 月 26 日更新:
サブクエリを使用するという当初の考えに戻りましたが、どこかで取得したと思ったときに、クエリが外部から評価され、サブクエリが評価されるという文書化された MySQL の問題に遭遇しました。行ごとに実行され、現実的な時間では終了しません。これが私がやろうとしていたことです:
SELECT * FROM tbl_1
WHERE name = ANY
(SELECT name FROM tbl_1 WHERE other_names LIKE '%A%' or name LIKE '%A%')
OR other_names = ANY
(SELECT name FROM tbl_1 WHERE other_names LIKE '%A%' or name LIKE '%A%')
サンプルテーブルを使用して必要なものを返しますが、前述のMySQLの問題/バグにより、サブクエリが独立したクエリではなく依存クエリと見なされます。その結果、最終的にタイムアウトになるため、実際のテーブル (〜 250,000 行) でクエリをテストできませんでした。
この問題の主な回避策は、サブクエリではなく結合を使用することであると読みましたが、それを自分がやろうとしていることにどのように適用するかわかりません。考えれば考えるほど、PHP/Python を使用してサブクエリを個別に実行し、結果の配列を使用して必要なメイン クエリを作成する方がよいかもしれません。ただし、列内の用語が私の例ほど適切ではないため、一部の結果を見逃す可能性があると考えています (用語の一部は複数の単語であり、一部は括弧で囲まれ、他の名前は必ずしもカンマではありません)。分離など)。
または、次のような必要なリンクを作成する別のテーブルを作成することを考えています。
| 1 | A | B, C|
| 2 | B | C, A|
| 3 | C | A, B|
しかし、私が扱っているデータと、そのデータが存在する標準化されていない形式を考えると、言うは易く行うは難しだと思います。
現時点で私が強く検討しているルートは、簡単に作成できるリンク (つまり、name:other_names の比率が 1:1) を使用して別のテーブルを作成することです。 other_names 列。結果を簡素化し、おそらく全体的なパフォーマンスを向上させるために、LIKE の使用を排除/制限し、ユーザーが少なくとも 1 つの正確な名前を知っていることを要求することもあります。
結論として、私は自分が制御できない入力データを操作するのが嫌いです。