42

レコードとデータの 2 つのテーブルがあります。records には複数のフィールド (名、姓など) があります。これらの各フィールドは、実際の値が格納されるデータ テーブルの外部キーです。複数のレコード フィールドを検索する必要があります。

以下は INTERSECT を使用したクエリの例ですが、MySQL で動作するクエリが必要です。

SELECT records.id FROM records, data WHERE data.id = records.firstname AND data.value = "john"
INTERSECT
SELECT records.id FROM records, data WHERE data.id = records.lastname AND data.value = "smith"

助けてくれてありがとう。

4

7 に答える 7

33

内部結合を使用して、別のテーブルに一致する行がある行をフィルター処理できます。

SELECT DISTINCT records.id 
FROM records
INNER JOIN data d1 on d1.id = records.firstname AND data.value = "john"
INNER JOIN data d2 on d2.id = records.lastname AND data.value = "smith"

他の多くの選択肢の 1 つはin句です。

SELECT DISTINCT records.id 
FROM records
WHERE records.firstname IN (
    select id from data where value = 'john'
) AND records.lastname IN (
    select id from data where value = 'smith'
)
于 2010-02-19T23:35:37.660 に答える
16

この方法の方がはるかに簡単だと思いますが、最初に多数の重複レコードをロードするため、この方法に関連するオーバーヘッドが少しあります。私はこれを約10000〜50000レコードのデータベースで使用し、通常は約5つのクエリと交差し、パフォーマンスは許容範囲内です。

交差させたい各クエリを「UNIONALL」して、毎回取得したクエリを確認するだけです。

SELECT * From (

    (Select data1.* From data1 Inner Join data2 on data1.id=data2.id where data2.something=true)
    Union All
    (Select data1.* From data1 Inner Join data3 on data1.id=data3.id where data3.something=false)

) As tbl GROUP BY tbl.ID HAVING COUNT(*)=2 

したがって、両方のクエリで同じレコードを取得した場合、そのカウントは2になり、最後のラップアラウンドクエリにはそれが含まれます。

于 2012-05-15T08:49:58.157 に答える
5

代わりに結合を使用します。

SELECT records.id
FROM records
JOIN data AS D1 ON records.firstname = D1.id
JOIN data AS D2 ON records.lastname = D2.id
WHERE D1.value = 'john' and D2.value = 'smith'

ここにいくつかのテストデータがあります:

CREATE TABLE records (id INT NOT NULL, firstname INT NOT NULL, lastname INT NOT NULL);
INSERT INTO records (id, firstname, lastname) VALUES
(1, 1, 1),
(2, 1, 2),
(3, 2, 1),
(4, 2, 2);

CREATE TABLE data (id INT NOT NULL, value NVARCHAR(100) NOT NULL);
INSERT INTO data (id, value) VALUES
(1, 'john'),
(2, 'smith');

期待される結果:

2

テスト データはおそらく投稿者には役に立ちませんが、ソリューションが正しく機能することを確認するためにソリューションをチェックしたい有権者や、自分の回答をテストできるように回答を送信したい人には役立つかもしれません。

于 2010-02-19T23:39:55.540 に答える