-1

私は現在クエリを書いています。テーブルからすべてのレコードを選択したい。レコードは、外部キーの複数の値に基づきます。たとえば、1と2の両方に関連するすべてのレコード。テーブルが持っている可能性があります

 id  name uid
 1    bil   3 
 2    test   3
 3    test  4
 4    test  4
 5    bil   5
 6    bil   5

3に関連するが、4にも関連するすべてのレコードを選択したいのですが、この場合はレコード番号2です。

SELECT id 
FROM `table` 
WHERE uid = value1 AND like_id 
       IN (SELECT like_id 
            FROM likes 
            WHERE uid = uid2) 
LIMIT 0 , 30
4

1 に答える 1

0

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のテーブル内の行も見つかります。likesname

外側のクエリでテーブルから検査される行の数が限られている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

どちらのクエリでも最適なパフォーマンスを得るには、適切なインデックスが重要です。

于 2013-01-18T22:50:07.513 に答える