У меня проблема с подключением к этим 4 столам

Модель моей базы данных

Я хочу подсчитать количество бронирований с разными типами (пользователь [mrbs_users.id], комната [mrbs_room.room_id], область [mrbs_area.area_id]).

Однако, когда я выполняю этот запрос (для пользователя (id = 1))

SELECT count(*)
FROM mrbs_users JOIN mrbs_entry ON mrbs_users.name=mrbs_entry.create_by 
                JOIN mrbs_room ON mrbs_entry.room_id = mrbs_room.id 
                JOIN mrbs_area ON mrbs_room.area_id = mrbs_area.id
WHERE mrbs_entry.start_time BETWEEN "145811700" and "1463985000" 
      or 
      mrbs_entry.end_time BETWEEN "1458120600" and "1463992200" and mrbs_users.id = 1 

Результат - общее количество резервирований каждого пользователя, а не только пользователя, у которого есть id = 1.

Так что если кто-нибудь может мне помочь .. Заранее спасибо.

sql
1
Vincent DUPONT 8 Май 2016 в 16:55

2 ответа

Лучший ответ

Используйте круглые скобки в предложении where, если у вас более одного условия. Ваш where анализируется как:

WHERE (mrbs_entry.start_time BETWEEN "145811700" and "1463985000" ) or
      (mrbs_entry.end_time BETWEEN "1458120600" and "1463992200" and
       mrbs_users.id = 1
      )

Предположительно, вы намерены:

WHERE (mrbs_entry.start_time BETWEEN 145811700 and 1463985000  or
       mrbs_entry.end_time BETWEEN 1458120600 and 1463992200
      ) and
      mrbs_users.id = 1

Кроме того, я удалил кавычки вокруг строковых констант. Смешивать типы данных - плохая практика, и в некоторых базах данных преобразование между типами может сделать запрос менее эффективным.

2
Gordon Linoff 8 Май 2016 в 13:59

Проблема, с которой вы столкнулись, вызвана неправильным условием WHERE.
Итак, должно быть:

  WHERE (mrbs_entry.start_time BETWEEN 145811700 AND 1463985000 )
         OR
        (mrbs_entry.end_time BETWEEN 1458120600 AND 1463992200 AND mrbs_users.id = 1)  

Более того, когда вы используете только INNER JOIN (JOIN), лучше избегать предложения WHERE, поскольку предложение ON выполняется перед предложением WHERE, поэтому критерии там будут работать быстрее.
Ваш запрос в этом случае должен быть таким:

SELECT COUNT(*)
FROM mrbs_users 
     JOIN mrbs_entry ON mrbs_users.name=mrbs_entry.create_by 
     JOIN mrbs_room ON mrbs_entry.room_id = mrbs_room.id 
          AND
          (mrbs_entry.start_time BETWEEN 145811700 AND 1463985000 
            OR ( mrbs_entry.end_time BETWEEN 1458120600 AND 1463992200 AND mrbs_users.id = 1)       
          )         
     JOIN mrbs_area ON mrbs_room.area_id = mrbs_area.id
0
Vasily Ivoyzha 8 Май 2016 в 14:44