I got a table agenda
in which the admin can make a reservation for him self or for someone else (another user). If the admin make the reservation for him self in agenda.user_id
will be stored the id
of admin.
In case that admin make a reservation for another person (another user) in agenda.user_id
will be stored the id
of the user for which the reservation will be made. The id
of the admin will be stored in another column agenda.booked_user
.
All the reservations are stored on agenda_users
table also. agenda_users
has this columns: id
,agenda_id
, user_id
. The agenda_users.user_id
it refers to agenda.user_id
.
I want to retrieve all the reservations made by the admin which has made reservations for himself and for other users also.
I did a query with some AND & OR:
SELECT agenda.* FROM agenda,agenda_users WHERE agenda_users.agenda_id=agenda.id AND (agenda_users.user_id=$user_id AND agenda_users.user_id=agenda.user_id) OR (agenda_users.user_id=agenda.user_id AND agenda.booked_user=agenda.$user_id) AND checkout IS NULL AND NOW() < DATE_ADD(date_end, INTERVAL 6 HOUR) ORDER BY type ASC,date_start ASC
Cannot figure out the right solution to ‘grab’ all the reservations the admin has made for him self and other users.
Advertisement
Answer
solving the old-style-joins will leave you with this SQL:
SELECT agenda.* FROM agenda INNER JOIN agenda_users ON agenda_users.user_id=agenda.user_id AND agenda_users.agenda_id=agenda.id WHERE (agenda_users.user_id=$user_id) OR (agenda.booked_user=agenda.$user_id) AND checkout IS NULL AND NOW() < DATE_ADD(date_end, INTERVAL 6 HOUR) ORDER BY type ASC,date_start ASC;
This SQL is almost human-readable (and understandable). ð
EDIT: Added extra ()
because AND has higher precedence than OR.
SELECT agenda.* FROM agenda INNER JOIN agenda_users ON agenda_users.user_id=agenda.user_id AND agenda_users.agenda_id=agenda.id WHERE ((agenda_users.user_id=$user_id) OR (agenda.booked_user=agenda.$user_id)) AND checkout IS NULL AND NOW() < DATE_ADD(date_end, INTERVAL 6 HOUR) ORDER BY type ASC,date_start ASC;