连接3个MySQL表,我做错了什么

时间:2016-05-21 20:16:03

标签: php mysql

我在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。但我无法让它发挥作用。

任何帮助都将不胜感激。

谢谢,塞巴斯蒂安

3 个答案:

答案 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