我有一张如下表格
+-------+ +----------+
| 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位置 满足。例如:我想选择酒店和所有地点 location = 1
我想输出:
+-----------------+
| HOTEL_LOCATION |
+-----------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
+-----------------+
我得到的输出是:
+-----------------+
| HOTEL_LOCATION |
+-----------------+
| 1 | 1 |
+-----------------+
以前我用我糟糕的英语道歉
有人能帮助我吗?感谢
答案 0 :(得分:0)
如果您所说的是某个地理位置可能包含多家酒店且您想按地点选择,那么
+-----------------+
| HOTEL_LOCATION |
+-----------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 4 |
| 3 | 5 |
+-----------------+
相反,应该是
+-----------------+
| HOTEL_LOCATION |
+-----------------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 3 |
+-----------------+
更新 - 发表评论后:
我认为你想要的是:
SELECT h.*, GROUP_CONCAT( DISTINCT l.lokasi_name SEPARATOR ",") AS hotel_lokasi FROM lokasi_hotel lh1, hotel h, lokasi l, lokasi_hotel lh2
WHERE lh1.lhotel_lokasi_id = 1
AND h.hotel_id = lh1.lhotel_hotel_id
AND lh2.lhotel_lokasi_id = l.lokasi_id
AND lh2.lhotel_hotel_id = lh1.lhotel_hotel_id
GROUP BY hotel_nama
它产生:
Hotel ... Lokasi
---------------- ---------------
Dian Hotel Dekat Pusat Kota,Dekat Jalan Pantura
Hotel Dedy Jaya Dekat Pusat Kota,Dekat Wisata,Dekat Jalan Pantura
您需要两次加入lokasi_hotel。一旦确定了指定地区的酒店,一旦确定那些酒店的其他地点。
另外,我没有看到你的LEFT JOIN
是必要的。我相信他们只会混淆你的逻辑。 INNER JOIN
s(或我提供的等价物)连接表,其中表的设计始终与ID匹配。
答案 1 :(得分:0)
我认为有两个问题:
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
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
子句中的条件在加入之后应用于结果集。
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