2013-01-18 41 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 –