大家好我有两张桌子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
任何人都可以告诉那里有什么吗?
此致
答案 0 :(得分:1)
只做
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上的“PreQuery”。
由于如果在“OTHER”表中找不到这样的匹配,左连接将导致NULL值,COALESCE()说...从参数1获取值。如果为null,则获取第二个value ...并将其放入名为... RoomType或RoomTypeCount的最终查询列中,如本例所示。因此,您的最终查询将不会有任何“NULL”作为结果的一部分,但至少是期望的正确数据类型(分别为char和numeric)。
答案 1 :(得分:1)
如果使用聚合函数,则应将每列(聚合列除外)放入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)