我有一个像这样的表和数据
id | term_id | name_id
1 | 4 | 1
2 | 6 | 1
3 | 5 | 2
4 | 6 | 2
3 | 4 | 3
4 | 6 | 3
我想要一个查询,以便我只能获得那个附加了4和6 term_id的name_id ...如果我查询4,6,2它不应该显示任何东西,因为没有named_id附加到所有三个他们或喜欢4,5它不应该显示任何东西,因为非相同的4和5
答案 0 :(得分:2)
SELECT Name_ID
FROM Table1 t
WHERE term_id IN (4,6)
GROUP BY NAME_ID
HAVING COUNT(*) = 2
答案 1 :(得分: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 | +---------+
答案 2 :(得分: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子句基于该组的最终结果。在这种情况下,它正在查看限定= 2的记录的COUNT(*)。
由于您担心给定的Name_ID与BOTH 4和6条款相关联,我们需要任何名称,其中的ID在BOTH中找到...因此WHERE子句的OR条件。我们想要一个人与4 OR 6相关联的记录。如果在结果中只找到一条记录(只有4或6),它们的COUNT()值将等于1并因此从结果集...只有那些符合条件的人才会有一个计数()= 2,因此包含在最终结果中......
要查看其外观,请尝试此查询...
select
name_id,
count(*) as TotalTermsPerName
from
YourTable
group by
name_id
您将获得至少1个学期的所有姓名ID,以及根据您的数据可以拥有10个或更多学期的其他人。由于原始查询仅考虑4和6的条件,因此可达到的最大计数最多为2。
希望这有帮助,而不仅仅是查询答案,而不是理解事情的基础。
答案 3 :(得分:0)
SELECT DISTINCT name_id
FROM t
WHERE
term_id = 4
AND
name_id IN (SELECT name_id FROM t WHERE term_id = 6)