value1
" " がどこから来ているのか、" uid2
" がどこから来ているのか、列 " " がどこから来ているのか、まったく明確ではありませんlike_id
。これらの列名は、サンプル テーブルには表示されません。サンプル クエリは 2 つの異なるテーブル名 (table
およびlikes
) を参照していますが、1 つのサンプル テーブルのデータのみを表示しており、そのテーブルには という名前の列がありませんlike_id
。
value1
クエリの" " と " " がリテラルであると仮定した場合uid2
、またはクエリに提供されたパラメーターをバインドすると、1、2、3、および 4 の値の指定 (さまざま) を考えると、これは妥当と思われます。 " like_id
" 列がまだ残っています。IN サブクエリの SELECT リストで参照されていることを考えると、それが " likes
" テーブルの列であると想定し、外側のクエリで参照されていることを考えると、それが " " テーブルの列であると想定します。 (残念ながら名前が付けられた)table
テーブル。
(要するに、動作中のテスト ケースを複製することを不可能にしているため、クエリがどのように「正しい」結果を返すかはまったく明確ではありません。)
サンプルデータに示されているように、単一のテーブルが与えられます。
CREATE TABLE likes (id INT, name VARCHAR(4), uid INT);
INSERT INTO likes VALUES (1,'bil',3),(2,'test',3),(3,'test',4)
,(4,'test',4),(5,'bil',5),(6,'bil',5);
ALTER TABLE likes ADD PRIMARY KEY (id);
ALTER TABLE likes ADD CONSTRAINT likes_ix UNIQUE KEY (uid, name);
その単一のテーブルに対してクエリを実行し、uid=3 に関連付けられた「いいね」を uid=4 に関連付けられた「いいね」と照合し、照合が「名前」列で行われると仮定すると、それから
SELECT t.id
FROM `likes` t
WHERE t.uid = 3
AND EXISTS
( SELECT 1
FROM `likes` s
WHERE s.name = t.name
AND s.uid = 4
)
id
これにより、uid=3のテーブルから行が返され、一致する値を持つ uid=4likes
のテーブル内の行も見つかります。likes
name
外側のクエリでテーブルから検査される行の数が限られているlikes
場合、相関サブクエリを実行する必要がある回数が制限され、妥当なパフォーマンスが得られるはずです。
大規模なセットの場合、通常、結合操作のパフォーマンスが向上し、同等の結果が返されます。
SELECT t.id
FROM `likes` t
JOIN `likes` s
ON s.name = t.name
AND s.uid = 4
WHERE t.uid = 3
GROUP
BY t.id
どちらのクエリでも最適なパフォーマンスを得るには、適切なインデックスが重要です。