从左边连接表的id中选择表格中的行

时间:2015-03-30 11:56:42

标签: mysql left-join

我有3张桌子:

+-------------+    +-------------+    +-------------+
|    hotel    |    |   hot_cat   |    |   category  |
+------+------+    +------+------+    +-------------+
|  id  | name |    |  hid |  cid |    |  id  | name |
+------+------+    +------+------+    +-------------+
|   1  |   X  |    |   1  |   1  |    |   1  | cat1 |
+------+------+    +------+------+    +-------------+
|   2  |   Y  |    |   1  |   2  |    |   2  | cat2 |
+------+------+    +------+------+    +-------------+
|   3  |   Z  |    |   2  |   2  |    |   3  | cat3 |
+------+------+    +------+------+    +-------------+
                   |   2  |   3  |    |   4  | cat4 |
                   +------+------+    +-------------+
                   |   2  |   4  |
                   +------+------+

我想选择类别有些价值的酒店,但是所有其他类别都分配给这家酒店。我有这个问题:

SELECT hot.*,GROUP_CONCAT(cat.name SEPARATOR '<br>') AS cats
FROM hotel hot
LEFT JOIN hot_cat hc ON hc.hid = hot.id
LEFT JOIN category cat ON cat.id = hc.cid
WHERE cat.id = 2
GROUP BY hot.id

所以我明白了:

+------+------+-------------------------+
|  id  | name |           cats          |
+------+------+-------------------------+
|   1  |   X  |          'cat2'         |
+------+------+-------------------------+
|   2  |   Y  |          'cat2'         |
+------+------+-------------------------+

我想要实现的目标:

+------+------+-------------------------+
|  id  | name |           cats          |
+------+------+-------------------------+
|   1  |   X  |      'cat1<br>cat2'     |
+------+------+-------------------------+
|   2  |   Y  |  'cat2<br>cat3<br>cat4' |
+------+------+-------------------------+

我也希望它在没有where子句的情况下工作,并获得没有分配类别的酒店:

+------+------+-------------------------+
|  id  | name |           cats          |
+------+------+-------------------------+
|   1  |   X  |      'cat1<br>cat2'     |
+------+------+-------------------------+
|   2  |   Y  |  'cat2<br>cat3<br>cat4' |
+------+------+-------------------------+
|   3  |   Z  |           ''            |
+------+------+-------------------------+

1 个答案:

答案 0 :(得分:0)

hot_cat表格中开始查询,然后加入hotel。它是表格中的一个额外跳跃,但它解决了这个问题。

SELECT hot.*,GROUP_CONCAT(cat.name SEPARATOR '<br>') AS cats
FROM hot_cat hc1
LEFT JOIN hotel hot ON hc1.hid = hot.id
LEFT JOIN hot_cat hc ON hc.hid = hot.id
LEFT JOIN category cat ON cat.id = hc.cid
WHERE hc1.id = 2
GROUP BY hot.id

相反,如果您不需要WHERE,那么您可以在没有WHERE子句的情况下使用现有查询。