其中“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的记录相关? –
是的,但我从来没有得到正确的答案。 –
我想获得属于两个外键值的所有记录。我说的是正确的,但它需要很长的时间 –