使用左联接获取其他表中的总行数


Using left join to get total rows in other table

嗨,我有两个表,yalladb_hotelyalladb_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"作为结果的一部分,但至少需要正确的数据类型(分别为字符和数字)。