根据外键的多个值选择记录

时间:2013-01-18 21:34:41

标签: mysql

我正在撰写查询。我想从表中选择所有记录。记录将基于外键的多个值。例如,与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

1 个答案:

答案 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
       )

这将返回id表中uid = 3的行的likes,其中我们还在likes表中找到了一行,其中uid = 4且匹配{{ 1}}值。

鉴于从外部查询的name表中检查的行数有限,这给出了需要运行相关子查询的有限次数,这应该可以提供合理的性能:

对于大型集合,连接操作通常可以更好地返回等效结果:

likes

任一查询的最佳性能关键都是适当的索引。