I'm putting together a fairly simple query with a subquery in the JOIN statement. It only works if I include an * in the subquery select. Why?
This works
$sql = 'SELECT locations.id, title, name, hours.lobby
FROM locations
LEFT JOIN states ON states.id = locations.state_id
LEFT JOIN (SELECT *, type_id IS NOT NULL AS lobby FROM location_hours) AS hours ON locations.id = hours.location_id
GROUP BY locations.id';
This doesn't
$sql = 'SELECT locations.id, title, name, hours.lobby
FROM locations
LEFT JOIN states ON states.id = locations.state_id
LEFT JOIN (SELECT type_id IS NOT NULL AS lobby FROM location_hours) AS hours ON locations.id = hours.location_id
GROUP BY locations.id';
Should I even be doing it this way? I thought * was not best if you don't need all the fields?
try this (if I understood your intent correctly, that you wanted to filter on type_id not null):
SELECT locations.id, title, name, hours.lobby
FROM locations
LEFT JOIN states
ON states.id = locations.state_id
LEFT JOIN (SELECT location_id, type_id AS lobby
FROM location_hours
WHERE type_id IS NOT NULL) AS hours
ON locations.id = hours.location_id
GROUP BY locations.id';
The explanation is that you have to select in the inner query all the fields which are referenced in the outer query.
Since you want to have non-NULL values for type_id, you shouldn't be using a LEFT JOIN for it at all. You'll want the following, which uses a standard JOIN.
$sql = 'SELECT locations.id, title, name, location_hours.type_id
FROM locations
JOIN location_hours ON location_hours.location_id = locations.id
LEFT JOIN states ON states.id = locations.state_id
WHERE location_hours.type_id IS NOT NULL
GROUP BY locations.id';
The whole point of a JOIN is that it only joins rows that actually exist. So you won't get any rows where location_hours doesn't have a corresponding location_id to locations.id. Then you just filter out NULL values for location_hours.type_id.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.