【问题标题】:MySQL - How to join two tables without duplicates?MySQL - 如何连接两个没有重复的表?
【发布时间】:2011-11-25 20:50:51
【问题描述】:

我有两个如下表

hotels
------
hotelID
hotelName

第二张桌子

operators
---------
opID
opName
opServices
opHotelID

一个简短的解释:在第一个表中,我有很多酒店都有一个唯一的增量 ID。第二个表格包含所有为这家酒店提供附加服务的运营商。这里的 opID 也是唯一的,但 opHotelID 存在多次,因为可能有许多运营商提供酒店。

现在,我想要得到的是以下内容:

我想获取 HotelName 和一个额外的列(称为 Operators),其中列出了提供酒店的所有运营商。

所以结果应该是这样的……

123 - Hotel ABC - OP1,Op2,OP3

而不是这个...

123 - Hotel ABC - OP1
123 - HOtel ABC - OP2
123 - Hotel ABC - OP3

有没有办法在一个 SQL 查询中做到这一点,或者你将如何解决这个问题?我目前正在研究搜索功能,目前我有一个带有左连接的简单 SELECT 查询,但这会返回更多行。现在搜索应该只显示唯一的 HotelID,并将不同的运算符组合在一列中。

感谢您的帮助,祝您有美好的一天...

再见 世嘉

【问题讨论】:

    标签: php mysql join duplicates


    【解决方案1】:

    试试这个:

    SELECT hotels.hotelID, 
    hotels.hotelName,
    GROUP_CONCAT(operators.opName SEPARATOR ', ') AS opList
    FROM hotels
    INNER JOIN operators 
    ON operators.opHotelID = hotels.hotelID
    GROUP BY(hotels.hotelID)
    

    如果你想拥有运营商的数量,你必须像这样在运营商 ID 上使用 COUNT:

    SELECT hotels.hotelID, 
    hotels.hotelName,
    GROUP_CONCAT(operators.opName SEPARATOR ', ') AS opList,
    COUNT(operators.opID) AS nbOperatos
    FROM hotels
    LEFT JOIN operators 
    ON operators.opHotelID = hotels.hotelID
    GROUP BY(hotels.hotelID)
    

    【讨论】:

    • 你能告诉我如何计算行数吗?尤其是当我向查询添加 LIMIT 时。如何获得此查询产生的最大行数?简单的 COUNT 不起作用。
    • 我编辑了计数选项的答案。您必须将内部连接替换为左连接,以便使用没有操作员的酒店。
    【解决方案2】:

    您可以使用GROUP_CONCAT

    【讨论】:

      【解决方案3】:

      您应该有一个简单的链接表,这将为许多运营商与酒店创建多对多关系

      operatorhotels
      ---------
      opID
      opHotelID
      

      【讨论】:

      • 你能给我一个例子,当我有这个额外的表时,查询会是什么样子?谢谢。
      【解决方案4】:

      如果你不想改变你的数据库设计,你可以使用这个查询

      SELECT hotelID,hotelName,opName FROM hotels h
      INNER JOIN operators o ON  h.hotelID = o.opHotelID
      GROUP BY h.hotelID,hotelName,opName 
      

      否则,创建一个映射表,生成many to many 关系

      【讨论】:

      • 首先感谢您的回答,但是当我运行此查询时,它永远不会结束(我还添加了 LIMIT 10)。两个表都有大约 10 万条记录。是性能很差还是问题出在哪里?
      【解决方案5】:

      您应该按照已经建议的方式使用 GROUP_CONCAT。这是查询:

      SELECT h.hotelID, h.hotelName, GROUP_CONCAT(o.opName) 
      FROM hotels h
      INNER JOIN operators o ON h.hotelID = o.opHotelID
      GROUP BY h.hotelID
      

      【讨论】:

      • 谢谢,这个查询永远不会结束的原因是什么? (我在 db 服务器上的 mysql 客户端测试了这个)
      • 数据库有其他问题,需要重启mysql。现在 GROUP_CONCAT 工作正常。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      相关资源
      最近更新 更多