2011-01-06 113 views
0

我有一个表和数据这样MySQL查询帮助

id | term_id | name_id 
1 | 4  | 1 
2 | 6  | 1 
3 | 5  | 2 
4 | 6  | 2 
3 | 4  | 3 
4 | 6  | 3 

我希望有一个查询,使我只能得到其中有4连接到它...如果我查询4的名_ID和6 term_id, 6,2因为没有named_id连接到他们三个应该不会显示我什么或喜欢4,5,因为不具有相同的4和5

回答

2
SELECT Name_ID 
FROM Table1 t 
WHERE term_id IN (4,6) 
GROUP BY NAME_ID 
HAVING COUNT(*) = 2 
+1

认为是“或”语句,但我想一些像和声明一样告诉我名字的ID与4和6没有或4或6,因为如果把4和6和2不应该告诉我什么 – 2011-01-06 12:32:49

+0

这将返回一个名_ID为两排,同样名_ID和term_id两个4:'( -1,4,2-),(2,4,2)`。这是不正确的。 – Ishtar 2011-01-06 13:01:08

0
select 
     name_id 
    from 
     YourTable 
    where 
     term_id = 4 or term_id = 6 
    group by 
     name_id 
    having 
     count(*) = 2 

为了澄清什么是应该不会显示任何内容发生,你需要了解“GROUP BY” “和”HAVING“上下文。通过强制SQL查询将其标识为“Group By”子句的列分组为许多限定记录。这恰好是查询中的同一列。

接下来,HAVING子句是基于组的所有记录后的最终结果是通过资格预审和收录。在这种情况下,它正在查看合格记录的COUNT(*)= 2.

由于您关心的是与4和6的BOTH条款相关联的给定Name_ID,因此我们需要任何其ID为在BOTH中找到...因此WHERE子句的OR条件。我们希望,当一个人用4或6相关联。如果在结果中,只有一个记录被发现(仅4或6),它们的COUNT()值将等于1,因而从结果集中丢弃任何记录......只有那些既条款符合资格将有一个计数()= 2,因此包含在最终的结果...

要看到,否则它可能看起来像什么,尝试此查询...

select 
     name_id, 
     count(*) as TotalTermsPerName 
    from 
     YourTable 
    group by 
     name_id 

你会得到所有名ID以最小的1项,和其他人可能有10项以上,基于您的数据。由于原来的查询只考虑4和6的条款,可以达到的最大数量将是最大数量为2

希望这会有所帮助,而不仅仅是查询答案,并不理解HOW的基础工作。

+0

查询的错误有必须置于组之后 – cristian 2011-01-06 12:29:30

+1

认为是“或”语句,但我想有些像和声明一样告诉我名字的ID与4和6没有或4或6,因为如果把4,6及二不要告诉我什么 – 2011-01-06 12:30:55

0
SELECT DISTINCT name_id 
FROM t 
WHERE 
    term_id = 4 
    AND 
    name_id IN (SELECT name_id FROM t WHERE term_id = 6) 
1

这是它(如果我理解你想要的):

SELECT t1.name_id 
FROM table1 t1 
INNER JOIN table1 t2 ON t1.name_id=t2.name_id 
WHERE (t1.term_id = 4 AND t2.term_id=6) OR (t1.term_id = 6 AND t2.term_id=4) 
GROUP BY name_id;

当我运行此查询我得到

 
+---------+ 
| name_id | 
+---------+ 
|  1 | 
|  3 | 
+---------+