我正在撰写查询。我想从表中选择所有记录。记录将基于外键的多个值。例如,与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
答案 0 :(得分:0)
根本不清楚“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
表中uid = 3的行的likes
,其中我们还在likes
表中找到了一行,其中uid = 4且匹配{{ 1}}值。
鉴于从外部查询的name
表中检查的行数有限,这给出了需要运行相关子查询的有限次数,这应该可以提供合理的性能:
对于大型集合,连接操作通常可以更好地返回等效结果:
likes
任一查询的最佳性能关键都是适当的索引。