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

时间:2012-03-04 13:22:47

标签: php mysql left-join

大家好我有两张桌子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

任何人都可以告诉那里有什么吗?

此致

2 个答案:

答案 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)