MYSQL选择所有数据表,满足if子句表b

时间:2018-01-20 03:19:56

标签: mysql

  

我有一张如下表格

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

以前我用我糟糕的英语道歉

     

有人能帮助我吗?感谢

2 个答案:

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

1

WHERE lh.lhotel_lokasi_id = 1表示lh.lhotel_lokasi_id IS NOT NULLLEFT 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. 找出位置1
  2. 中的酒店
  3. 仅选择这些酒店(如果需要,请提供有关其位置的信息)
  4. 总结

    我想你想要这样的东西:

    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