2

テーブル B 内の一致するタグを使用してテーブル A から行をフェッチする必要がある場合は、単純な JOIN ON/WHERE B.name=X を実行します。しかし、MySQL は A からの行と B からの一致するタグのみを返します。

テーブル B に一致するテーブル A からすべてを取得すると同時に、テーブル A の行にリンクされているテーブル B からすべてを取得したい場合はどうすればよいですか。

A:
a.id
1
2
3

B: 
b.id   | b.a_id   | b.name
1      | 1        | foo
2      | 1        | bar
3      | 1        | derp
4      | 2        | foo
5      | 2        | derp
6      | 3        | bar

A search for "foo" should then return
a.id   | b.id     | b.a_id   | b.name
1      | 1        | 1        | foo
1      | 2        | 1        | bar
1      | 3        | 1        | derp
2      | 4        | 2        | foo
2      | 5        | 2        | derp

私が得ることができる助けに感謝します。ありがとう!

4

2 に答える 2

0
SELECT a.id, b.id, b.name FROM a 
RIGHT JOIN b ON (a.id = b.a_id) 
WHERE a.id IN (SELECT b.a_id FROM b WHERE b.name = 'foo')

これがあなたが探しているものだと思います。最もパフォーマンスの高いソリューションではないかもしれませんが、うまくいくことを願っています。

編集:

SELECT a_new.id, b.id, b.name FROM 
    (SELECT b.a_id FROM b WHERE b.name = 'foo') AS a_new
RIGHT JOIN b ON (a_new.id = b.a_id)

これ以上良くなるとは思いません。基本的に、テーブルをクエリする必要はもうありません。'foo'に一致するすべての行をbからフェッチしてから、それらをすべての関連アイテムと結合します。

于 2012-09-23T01:21:43.713 に答える
0
 SELECT * FROM a JOIN b on b.a_id = a.id 
    WHERE EXISTS (SELECT 1 from b where a_id = a.id and b.name = 'foo')

コメントの嵐の後、私はあなたが何を尋ねようとしているのか理解しました. これは、IN 句よりも高速なソリューションです。

IN 句には厄介な問題がいくつかあります。つまり、MySQL はその中の各値を検査する必要があるため、返されるすべての行に対してカーソルを再オープンする必要があります。EXIST 句は、カーソルが存在することを確認しているだけなので、カーソルを再利用できます。この場合、実際に実行する必要がある個別のクエリの数は、a の値の数に等しいことに注意してください。カーソルは存在をテストするために開かれるだけで、読み取られるわけではないため、クエリが異なる場合を除き、新しいカーソルを作成する必要はありません。

MySQL の場合はこれをバックアップするためにいくつかのドキュメントを追跡する必要がありますが、これは Oracle の場合です。

于 2012-09-23T01:14:20.343 に答える