0

私はLAMPを使用しています。MySqlには、列X、Y、Zのテーブルがあります。複数のセットとサブセットから個別のレコードを選択する必要があります。私の最初の基準がWHEREY=Aの場合; 次に、次のことができる必要があります。

  • Y = Aのレコードを選択して、セットBを取得します。
  • XがセットBにあり、Z = 123であるレコードを選択して、セットCを取得します。
  • YがセットBにあり、Z = 456であるレコードを選択して、セットDを取得します。
  • XがセットDにあり、Z = 789であるレコードを選択して、セットEを取得します。

テーブルがかなり大きくなる可能性があり、これをどこから始めればよいのかよくわかりません。いくつかの可能なアプローチは次のとおりです。

  1. 複数の個別のクエリがあります。この場合、一方のクエリの結果セットをキャッシュして、もう一方のクエリに使用するにはどうすればよいですか?Memcached?
  2. ネストされたサブクエリを使用します。しかし、内側のクエリの結果は、純粋に外側のクエリを制限するためのものですよね?それらを結果に表示するにはどうすればよいですか?
  3. UNIONを使用します。しかし、あるクエリの結果を保存して、別のクエリへの入力として使用するにはどうすればよいでしょうか。
  4. テーブルをそれ自体に複数回参加させます。これにより、外側の行が複数回繰り返されるデカルト結果が生成されます。これは、管理しやすいはずの多次元PHP配列にマップされます。パフォーマンスはどうですか?

私はオプション番号4に傾いていますが、100%確実ではありません。私は車輪の再発明をしていますか?

とても有難い...

4

1 に答える 1

1

X の制限を定義していないため、あなたの目標はわかりませんが、あなたの説明から、セット E は空になると思います。これは、セット D に Z が 456 の行が既に含まれているためです。したがって、その結果セットに対して別のクエリを実行して、Z が 789 の条件で E を生成すると、D のすべての行が 456 であるため、行が返されません。

では個人的な意見を。

  1. 可能な限りデカルト積を避ける - 結合は適切ですが、可能であれば外積を避けるように注意してください
  2. 必要に応じて、テーブルを非正規化してクエリの効率を向上させます
  3. 要件を満たす最小の結果セットを生成するクエリを生成します
  4. 可能であれば、サブクエリを使用して結果セットのサイズを縮小します
  5. クエリ オプティマイザーを信頼して、可能であればサブクエリを避ける
  6. SQL には最適な方法でデータを計算する機能とリソースがあるため、可能な限り SQL に作業を行わせる

上記の項目 4 を強調するために、D の例では、サブクエリやその他の一時ストレージなしで次のクエリを記述できることに言及したいと思います。

SELECT * FROM MyTable WHERE Y = A AND Z = 456

さて、あなたが何を望んでいるのかを推測することで、あなたのジレンマを解決できるかもしれません:

SELECT * FROM MyTable WHERE Y = A AND Z IN (123, 456, 789)

または:

SELECT * FROM MyTable WHERE Y = A AND (Z = 123 OR Z = 456 OR Z = 789)

お役に立てれば

于 2012-12-17T01:29:38.903 に答える