我在MySQL中有3个包含以下数据的表
标签表
id | groupId | name |
-----------------------------
1 | 1 | tag1 |
2 | 1 | tag2 |
3 | 1 | tag3 |
4 | 1 | tag4 |
groupId列现在不重要了。
练习表
id | name |
----------------------
1 | practice 1 |
2 | practice 2 |
3 | practice 3 |
4 | practice 4 |
和两者之间的桥梁( practiceTag 表)
id | practiceId | tagId |
-----------------------------------
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 2 | 1 |
但是当我尝试使用查询时:
SELECT practice.name
FROM practice
INNER JOIN practiceTag ON practiceTag.practiceId = practice.id
INNER JOIN tags ON practiceTag.tagId = tags.id
WHERE (tags.id = "1"
AND tags.id = "2"
AND tags.id = "3")
它没有返回任何东西。这没关系,因为我知道我的查询有点搞砸了。但是,我可以向您展示最接近的信息,我希望我的查询能做什么。
我搜索了论坛,发现我可以使用group_concat。但我无法让它发挥作用。
任何帮助都将不胜感激。
谢谢,塞巴斯蒂安
答案 0 :(得分:0)
你in
条款不是和
SELECT practice.name
FROM practice
INNER JOIN practiceTag ON practiceTag.practiceId = practice.id
INNER JOIN tags ON practiceTag.tagId = tags.id
WHERE tags.id in ( '1', '2', '3') ;
如果id是数字
SELECT practice.name
FROM practice
INNER JOIN practiceTag ON practiceTag.practiceId = practice.id
INNER JOIN tags ON practiceTag.tagId = tags.id
WHERE tags.id in ( 1, 2, 3) ;
查询等效
SELECT distinct practice.name
FROM practice
INNER JOIN practiceTag ON practiceTag.practiceId = practice.id
INNER JOIN tags ON practiceTag.tagId in (1,2,3)
如果你只需要在所有3个tagId匹配时使用practice.name,你应该使用临时表来获取连接表
SELECT distinct practice.name
FROM practice
inner join (
select practiceId from
( select distinct practiceTag.practiceId as praticeId, practiceTag.tagId as tagId
from tags ) as t1
where tagId in (1,2,3)
having count(*) > 2
group by praticeId ) as t2;
答案 1 :(得分:0)
我认为你的tags.id列是整数而不是字符串,所以你的sql查询将是这样的:
SELECT practice.name
FROM practice
INNER JOIN practiceTag ON practiceTag.practiceId = practice.id
INNER JOIN tags ON practiceTag.tagId = tags.id
WHERE tags.id in (1,2,3);
答案 2 :(得分:-1)
在WHERE
部分,您要求同时id
1,2和3的结果。
将AND
中的WHERE
替换为OR