Question

I have a site where you can see venues. When you click on a single venue it displays a popup with it. There is a favorite button which can be active or not. This code is in ajax for this popup

SELECT * FROM venue_datetime
LEFT JOIN venue_calendar ON venue_datetime.calendar = venue_calendar.calendar_id
LEFT JOIN venue_events ON venue_calendar.event = venue_events.event_id
LEFT JOIN venue ON venue_events.venue = venue.venue_id
LEFT JOIN favorites ON venue.venue_id = favorites.favorites_venue_id OR venue.venue_id is null
LEFT JOIN users ON favorites.favorites_user_id = users.id OR favorites.favorites_user_id is null
WHERE datetime_id = ? AND id = ?

This part is not working as it was intended.

LEFT JOIN favorites ON venue.venue_id = favorites.favorites_venue_id OR venue.venue_id is null
LEFT JOIN users ON favorites.favorites_user_id = users.id OR favorites.favorites_user_id is null

Any ideas?

Was it helpful?

Solution

Based on comments

SELECT * FROM venue_datetime
LEFT JOIN venue_calendar ON venue_datetime.calendar = venue_calendar.calendar_id
LEFT JOIN venue_events ON venue_calendar.event = venue_events.event_id
LEFT JOIN venue ON venue_events.venue = venue.venue_id
LEFT JOIN favorites ON venue.venue_id = favorites.favorites_venue_id 
LEFT JOIN users ON favorites.favorites_user_id = users.id 
WHERE datetime_id = ? AND (users.id = ? or users.id is null)

OR

SELECT * FROM venue_datetime
LEFT JOIN venue_calendar ON venue_datetime.calendar = venue_calendar.calendar_id
LEFT JOIN venue_events ON venue_calendar.event = venue_events.event_id
LEFT JOIN venue ON venue_events.venue = venue.venue_id
LEFT JOIN favorites ON venue.venue_id = favorites.favorites_venue_id 
LEFT JOIN users ON favorites.favorites_user_id = users.id 
  AND users.id = ?
WHERE datetime_id = ? 

When using outer joins criteria has to take into account null values. So either the joins must handle is null from tables not returning all values OR you must put the limiting criteria on the join itself.

OTHER TIPS

Assuming that the user will always be there, then maybe do this:-

SELECT * 
FROM venue_datetime
INNER JOIN users ON users.id = ?
LEFT JOIN venue_calendar ON venue_datetime.calendar = venue_calendar.calendar_id
LEFT JOIN venue_events ON venue_calendar.event = venue_events.event_id
LEFT JOIN venue ON venue_events.venue = venue.venue_id
LEFT JOIN favorites ON venue.venue_id = favorites.favorites_venue_id AND favorites.favorites_user_id = users.id 
WHERE datetime_id = ? 

Join the users to the venue just on the users id, then left join the favourites based on both the venue and user.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top