mysql - sql 根据明细表一个字段查询主表列表,使用group,disctinct还是exists
巴扎黑
巴扎黑 2017-04-17 14:50:47
0
2
678

有两个表:
A:

| id | name | ---id主键

B:

| id | a_id | item_id | item_name | desc | ----id主键,a_id 与 A中的id关联

查询-包含item_id的所有的A记录

SELECT DISTINCT A.* FROM A JOIN B ON A.id = B.a_id WHERE item_id = 123;

SELECT A.* FROM A JOIN B ON A.id = B.a_id WHERE B.item_id =123 GROUP BY A.id;

SELECT A.* FROM A WHERE EXISTS (SELECT 1 FROM B WHERE B.a_id = A.id and B.item_id = 123);

这三种查询那种最好?

巴扎黑
巴扎黑

全員に返信(2)
黄舟

データの量が多い場合、2 番目または 3 番目の方法を使用することはお勧めできません。最初のものを使用することをお勧めします。私たちがプロジェクトに取り組んでいるとき、DBA が SQL をレビューするたび、サブクエリがあるとき、または SQL で GROUP BY が使用されているときは必ず、データのサイズとテーブルがどうなったのかを尋ねます。 GROUP BY とサブクエリを使用しないようにアドバイスされます。効率が遅いといつも言われます...私は初心者なので、なぜ遅いのか正確にはわかりません

いいねを押す +0
伊谢尔伦

意味的に要件を最もよく満たし、最も効率的である 3 番目のオプションを使用することをお勧めします。
最初の記述方法は、テーブル リンクを使用することです。テーブル A とテーブル B に 1 対多の関係がある場合、B のレコードをスキャンする必要がありません (要件は 1 つだけを見つけることであり、JOIN メソッドは次のとおりです)。さらに、個別の使用により、データベース内でソート操作が必要になる場合があり、効率がある程度影響を受けます。
2 番目の記述方法は標準 SQL ではありません。Group by にはフィールドが 1 つしかありません。理論的には、SELECT で A.* を記述する方法はサポートされていません。効率は最初の方法と同様です。
3 番目の記述方法では、exists ステートメントはデータベースによって半結合に最適化されます (これは Oracle の場合で、MySQL は実行計画が適切かどうかを確認する必要があります)。そのため、これが最も効率的です。 。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート