MySQL - 如何连接两个没有重复的表?

时间:2011-09-27 09:08:03

标签: php mysql join duplicates

我有两个表,如下所示

hotels
------
hotelID
hotelName

第二张表

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

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

现在,我想得到的是:

我想获得HotelName和一个额外的列(称为操作员),列出所有提供酒店的运营商。

所以结果应该是这样......

123 - Hotel ABC - OP1,Op2,OP3

而不是......

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

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

感谢您的帮助,祝您度过愉快的一天......

再见 WorldSignia

5 个答案:

答案 0 :(得分:2)

试试这个:

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)

答案 1 :(得分:1)

您可以使用GROUP_CONCAT

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

如果您不想更改数据库设计,可以使用此查询

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关系

答案 4 :(得分:0)

您应该按照建议使用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