2013-01-18 63 views
-2

我目前正在撰寫查詢。我想從表中選擇所有記錄。記錄將基於外鍵的多個值。例如與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 
+2

我不明白你在做什麼。 id = 2的記錄器如何與id = 3和id = 4的記錄相關? –

+0

是的,但我從來沒有得到正確的答案。 –

+0

我想獲得屬於兩個外鍵值的所有記錄。我說的是正確的,但它需要很長的時間 –

回答

0

其中「value1」即將到來這不是完全清楚來自「uid2」或來自「like_id」列的地方。這些列名不會出現在您的示例表中。您的示例查詢引用了兩個不同的表名(tablelikes),但您只顯示一個示例表的數據,並且該表沒有名爲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 
     ) 

,將返回該行的idlikes表中的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 

任一查詢的最佳性能的關鍵都是適當的索引。

+0

謝謝spencer7593 –