我有以下完美的查询:
SELECT *
FROM contacts
WHERE id in (
SELECT DISTINCT contacts.id
FROM contacts
INNER JOIN contacts2tags
ON contacts.id = contacts2tags.contactid
WHERE tagid in(7,4)
)
此处联系人表包含id,first_name,last_name,..和标记表包含id,name。 contacts2tags 表包含contactid和tagid,分别与contacts.id和tags.id相同
现在,我想要的是,只显示同时具有tagid 7和tagid 4的联系人。 我试过这样的事情:
SELECT *
FROM contacts
WHERE id IN
(
SELECT CT1.contactid
FROM
tags T1, contacts2tags CT1, tags T2, contacts2tags CT2
WHERE CT1.contactid = CT2.contactid
AND CT1.tagid = T1.id
AND CT2.tagid = T2.id
AND (T1.id = 7 AND T2.id = 4)
它也有效。 我的问题是,我想将上面的第二个查询转换为使用内部联接的查询。 我在PHP中的$ tmp中存储了一组id 我想使用这些ID并为它们编写上述查询。 我怎么做?我对sql感到不舒服。可能是一个非常简单的问题。 提前致谢
修改 下面的答案解决了这个问题。但是对于10k记录,sql运行速度非常慢。有什么优化建议吗?粘贴答案中给出的更新查询。
SELECT c.id
FROM contacts c
inner join contacts2tags t on c.id = t.contactid
where t.tagid in (7,4)
group by c.id
having count(distinct t.tagid) = 2
答案 0 :(得分:2)
这应该有效
SELECT c.id
FROM contacts c
inner join contacts2tags t on c.id = t.contactid
where t.tagid in (7,4)
group by c.id
having count(distinct t.tagid) = 2