Используя левое соединение, чтобы получить общее количество строк в другой таблице - PullRequest
1 голос
/ 04 марта 2012

Привет, у меня все есть две таблицы, 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

Может кто-нибудь сказать, что там?

Привет

Ответы [ 2 ]

1 голос
/ 04 марта 2012

Если вы используете функцию агрегирования, вы должны поместить все столбцы (кроме столбца агрегирования) в раздел 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)
1 голос
/ 04 марта 2012

Просто сделайте

COUNT (rm.id) как Total_Room_Types

Если у вас нет особой классификации, чтобы различать двухместные номера, номера с кроватью размера "queen-size" и "king-size".

Если ваш номер в отеле "Имя" относится к категории номеров, как описано выше, вам следует предварительно запросить типы номеров и присоединиться к ним.

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, соединенному с «PreQuery» на идентификаторе отеля.

Поскольку левое объединение в противном случае приведет к значениям NULL, если такие совпадения не найдены в какой-либо таблице «OTHER»,COALESCE () говорит ... Получите значение из параметра 1. Если это значение равно NULL, получите второе значение ... и поместите его в последний столбец запроса с именем ... RoomType или RoomTypeCount, как в этом примере.Таким образом, ваш конечный запрос не будет иметь никакого «NULL» как часть результата, но, по крайней мере, ожидается правильный тип данных (соответственно символ и число).

...