其中「value1
」即將到來這不是完全清楚來自「uid2
」或來自「like_id
」列的地方。這些列名不會出現在您的示例表中。您的示例查詢引用了兩個不同的表名(table
和likes
),但您只顯示一個示例表的數據,並且該表沒有名爲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
從likes
表中的uid = 3,我們也找到了排在likes
表中的uid = 4匹配的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
任一查詢的最佳性能的關鍵都是適當的索引。
我不明白你在做什麼。 id = 2的記錄器如何與id = 3和id = 4的記錄相關? –
是的,但我從來沒有得到正確的答案。 –
我想獲得屬於兩個外鍵值的所有記錄。我說的是正確的,但它需要很長的時間 –