使用子查询合并2个mysql查询
我想知道这里有没有人可以帮助解决我遇到的问题。我正在尝试将2个mysql查询合并为一个使用子查询的查询。我现在有2个查询separatly其产生的结果,我想:使用子查询合并2个mysql查询
这里有2个疑问:
SELECT contact_id FROM contacts
WHERE acc_id = 1 AND email LIKE "paul%"
SELECT c0.contact_id
FROM contact_tags c0 INNER JOIN contact_tags c1
on c0.contact_id = c1.contact_id INNER JOIN contact_tags c2
on c1.contact_id = c2.contact_id where c0.tag_id = 1
AND c1.tag_id = 2 AND c2.tag_id = 3
这里是从表中的一些示例数据:
Contacts:
contact_id acc_id email
54 1 [email protected]
Tags:
id contact_id tag_id
1 54 1
2 54 2
3 54 3
4 50 1
5 50 2
两个查询时独立运行产生这个结果是正确的:
contact_id
54
但是我是tryi NG嵌套在另一个里面一个查询到从单个查询产生相同的结果:
这是我曾尝试:
SELECT c0.contact_id
FROM
(
SELECT contact_id
FROM contacts
WHERE acc_id = 1 AND email LIKE "paul%"
) AS c0
LEFT JOIN contact_tags AS c1
ON c1.contact_id = c0.contact_id
AND (
SELECT c0.contact_id FROM contact_tags c0
INNER JOIN contact_tags c1
on c0.contact_id = c1.contact_id
INNER JOIN contact_tags c2 on c1.contact_id = c2.contact_id
where c0.tag_id = 1 AND c1.tag_id = 2 AND c2.tag_id = 3
)
WHERE c1.id IS NOT NULL
但是我知道这是不对的,因为我想只是返回单个唯一的联系人ID匹配上述所有条件:
contact_id
54
54
54
54
如果任何人都可以帮助我,这将是非常感激。
感谢
Select contact_id
From contacts
Where acc_id = 1 And email Like 'paul%'
And contact_id In (
Select Tags1.contact_id
From contact_tags As Tags1
Where Tags1.tag_id In(1,2,3)
Group By Tags1.contact_id
Having Count(Distinct Tags1.tag_id) = 3
)
或者:
Select contact_id
From contacts
Where contact_id In (
Select C1.contact_id
From contact_tags As Tags1
Join contacts As C1
On C1.contact_id = Tags1.contact_id
Where Tags1.tag_id In(1,2,3)
And C1.acc_id = 1
And C1.email Like 'paul%'
Group By C1.contact_id
Having Count(Distinct Tags1.tag_id) = 3
)
当我尝试运行第二个查询时,出现以下错误: #1054 - 'IN/ALL/ANY subquery'中的未知列'C1.contact_id' – 2011-04-27 17:54:38
@Paul Atkins - 这是一个错字。我不小心在主查询的Where子句中包含别名。已修复。 – Thomas 2011-04-27 17:58:30
感谢这似乎工作正是我需要它。虽然我无法弄清楚这行代码的含义“有计数(不同Tags1.tag_id)= 3'。你能推荐哪些地方我可以阅读这条线达到什么目的?谢谢 – 2011-04-27 18:09:20
为了有一个返回值,将来自第一和第二查询返回的所有联系人查询,使用此:
(假设第一个不重复返回contact_id
S)
SELECT contact_id
FROM contacts
WHERE acc_id = 1
AND email LIKE "paul%"
AND contact_id IN
(SELECT c0.contact_id
FROM contact_tags c0
INNER JOIN contact_tags c1
ON c0.contact_id = c1.contact_id
INNER JOIN contact_tags c2
ON c1.contact_id = c2.contact_id
WHERE c0.tag_id = 1
AND c1.tag_id = 2
AND c2.tag_id = 3
)
为什么第一个查询不会返回'50'? – 2011-04-27 17:22:03
@ypercube - 对不起,这是我的错误,第二行不应该在那里。我现在将它删除 – 2011-04-27 17:25:28
而且你想要一个显示哪个'contact_id'在这两个列表中的查询,对吧? – 2011-04-27 17:31:14