使用子查询合并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 

如果任何人都可以帮助我,这将是非常感激。

感谢

+0

为什么第一个查询不会返回'50'? – 2011-04-27 17:22:03

+0

@ypercube - 对不起,这是我的错误,第二行不应该在那里。我现在将它删除 – 2011-04-27 17:25:28

+0

而且你想要一个显示哪个'contact_id'在这两个列表中的查询,对吧? – 2011-04-27 17:31:14

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 
         ) 
+0

当我尝试运行第二个查询时,出现以下错误: #1054 - 'IN/ALL/ANY subquery'中的未知列'C1.contact_id' – 2011-04-27 17:54:38

+0

@Paul Atkins - 这是一个错字。我不小心在主查询的Where子句中包含别名。已修复。 – Thomas 2011-04-27 17:58:30

+0

感谢这似乎工作正是我需要它。虽然我无法弄清楚这行代码的含义“有计数(不同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 
)