2016-05-21 25 views
0

我有以下数据的3代表在MySQL连接3个MySQL表,我究竟做错了

标签

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。但我无法让它工作。

任何帮助,将不胜感激。

感谢,塞巴斯蒂安

+1

使用**或** WHERE你不能有一个字段值1和2以及3 - 只有1或2或3 –

+1

使用'WHERE tag.id在(1,2,3)' – Akam

+0

贝恩德感谢您的回复,但我有点寻找的方式只显示练习的名称,所有的标签 – Sebastjan

回答

-1

在你WHERE一部分,你问有id 1,2和3在同一时间的结果。

OR

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') ; 

替换您的WHEREAND如果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) 

如果你只想要practice.name当所有的3个tagsId匹配你应该使用临时表用于获取连接表

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

中的子句就像是OR对吗?是的,我的查询仍然返回0结果。 我有点看起来它会返回“练习1”,因为那个练习拥有全部3个标签。 谢谢 – Sebastjan

+1

Id是数字还是字符串?我要更新数值为 – scaisEdge

+0

的数字的答案,但即使我做'1'或1它的结果相同 – Sebastjan

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);