嗨,我有两个表,yalladb_hotel
和yalladb_room_types
,它们的结构是
yalladb_hotel
-----------------------------------------
| id | name | address | fax | telephone |
---------------------------------------------
和yalladb_room_types
-----------------------------
|id | hotel_id | roomtype_name | rate |
现在我想从酒店表格中获得所有信息,并想获得与酒店表格相关的房间类型的总数。我使用left join
,因为并非所有酒店都有房型。所以我使用了以下查询
SELECT
h.*,
count(rm.*) as total_room_types
FROM
yalladb_hotel h
LEFT JOIN yalladb_room_types rm
ON h.id=rm.hotel_id
LIMIT
0,5
但它正在产生以下错误,我完全无法理解错误是…
#1064 - You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version
for the right syntax to use near '*) as total_room_types FROM
yalladb_hotel h LEFT JOIN yalladb_room_types rm ON h' at line 1
有人能说出那里有什么吗?
问候
如果使用agregate函数,则应将所有列(agregate列除外)放入GROUP BY部分http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html
说明:
Select (these columns should be in group by section), count(agr_col)
from table
group by (here should be those columns also)
只需进行
COUNT(rm.id)为Total_Room_Types
除非您有具体的分类,否则,双人间、大号床间、特大号床间。
如果您的酒店房间"名称"是如上所述的房间类型分类,您应该首先预查询房间类型并加入其中。
SELECT
h.*,
COALESCE( PreQuery.Name, " " ) as RoomType,
COALESCE( PreQuery.RoomTypeCount, 0 ) as RoomTypeCount
FROM
yalladb_hotel h
LEFT JOIN ( select rm.hotel_id,
rm.name,
count(*) as RoomTypeCount
from
yalladb_room_types rm
group by
rm.hotel_id,
rm.name ) PreQuery
ON h.id=PreQuery.hotel_id
LIMIT
0,5
编辑澄清
澄清我的回答。你想要的不是仅仅计算房间的数量,而是每种房间类型的数量。根据您最初列出的结构,您将"名称"作为一列,现在根据您的编辑将其列为roomType_Name。我怀疑这一栏是用来描述房间类型的。因此,我的内部查询(相对于内部联接)告诉查询首先预聚合这些内容,按条件分组,并将其结果称为联接条件的"PreQuery"别名。然后,返回酒店主表LEFT,加入酒店ID上的"预查询"。
由于如果在"OTHER"表中找不到这样的匹配,则左联接将导致NULL值,COALESCE()表示。。。从参数1中获取值。如果为null,则获取第二个值。。。并将其放入名为…的最终查询列中。。。RoomType或RoomTypeCount。因此,您的最终查询不会有任何"NULL"作为结果的一部分,但至少需要正确的数据类型(分别为字符和数字)。