我有一个像下面的桌子
+-------+ +----------+
| HOTEL | | LOCATION |
+-------+ +----------+
| 1 | | 1 |
| 2 | | 2 |
| 3 | | 3 |
| 4 | | 4 |
| 5 | | 5 |
+-------+ +----------+
+-----------------+
| HOTEL_LOCATION |
+-----------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 4 |
| 3 | 5 |
+-----------------+
如果clausa位置是,我想选择酒店和所有位置
遇见。例如:我要选择酒店和所有地点
位置= 1
我要输出:
+-----------------+
| HOTEL_LOCATION |
+-----------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
+-----------------+
我得到的输出是:
+-----------------+
| HOTEL_LOCATION |
+-----------------+
| 1 | 1 |
+-----------------+
以前我对我的英语不好道歉
有人能帮我吗?谢谢
最佳答案
我认为有两个问题:
SELECT h.*, GROUP_CONCAT( DISTINCT l.lokasi_name SEPARATOR ",") AS hotel_lokasi
FROM hotel h
LEFT JOIN lokasi_hotel lh ON lh.lhotel_hotel_id = h.hotel_id
LEFT JOIN lokasi l ON l.lokasi_id = lh.lhotel_lokasi_id
WHERE lh.lhotel_lokasi_id = 1
GROUP BY h.hotel_nama
1
WHERE lh.lhotel_lokasi_id = 1
表示lh.lhotel_lokasi_id IS NOT NULL
,这使LEFT JOIN
没有意义。要保留
LEFT JOIN
,应使用: FROM hotel h
LEFT JOIN lokasi_hotel lh ON lh.lhotel_hotel_id = h.hotel_id AND lh.lhotel_lokasi_id = 1
但实际上,您想要的是常规的内部联接,因为您当然不希望看到所有酒店。
从概念上讲,您可以这样认为:
ON
子句中的条件在连接之前应用于连接的表,而WHERE
子句中的条件在连接之后应用于结果集。2
WHERE lh.lhotel_lokasi_id = 1
表示您只想查看与位置1
有关的行,实际上并非如此:实际上,您想查看与位置1
中存在的酒店有关的所有行。您需要完成两个步骤:
找出位置
1
中有哪些酒店仅选择那些酒店(如果需要,请提供其位置信息)
结论
我想你想要类似的东西:
SELECT h.*, GROUP_CONCAT( DISTINCT l.lokasi_name SEPARATOR ",") AS hotel_lokasi
FROM hotel h
JOIN lokasi_hotel lh ON lh.lhotel_hotel_id = h.hotel_id
JOIN lokasi l ON l.lokasi_id = lh.lhotel_lokasi_id
WHERE h.hotel_id IN (SELECT lhotel_hotel_id FROM lokasi_hotel WHERE lhotel_lokasi_id = 1)
GROUP BY h.hotel_nama
同样,您可以将
IN
替换为lokasi_hotel
上的第二个联接:SELECT h.*, GROUP_CONCAT( DISTINCT l.lokasi_name SEPARATOR ",") AS hotel_lokasi
FROM lokasi_hotel lh_filter
join hotel h ON lh_filter.lhotel_hotel_id = h.hotel_id
JOIN lokasi_hotel lh ON lh.lhotel_hotel_id = h.hotel_id
JOIN lokasi l ON l.lokasi_id = lh.lhotel_lokasi_id
WHERE lh_filter.lhotel_lokasi_id = 1
GROUP BY h.hotel_nama