Let's say I have a primary table record
, and it has 2 related tables fields
and comments
.
CREATE TABLE record (id int primary key, name varchar(20))
CREATE TABLE fields (record_id int, name varchar(20), val int)
CREATE TABLE comments (record_id int, who varchar(20), comment text)
I would like to run one query that fetches a set of records AND fetches all the related fields for that record, AND fetches all the comments related to that record.
If I do left joins to ensure I get the records, I would use:
select * from record
left join fields on (fields.record_id = record.id)
left join comments on (comments.record_id = record.id)
order by record.id
The problem is, I get back n * m rows for each record, where n is the number of fields, and m is the number of comments. I want to get back n + m rows (what makes sense is that the fields columns are all null while returning the comments, and the comments columns are all null while returning the fields). Is there a way to make this work aside from inserting a dummy comment and dummy field to join with? I would very much prefer not to have to perform an extra query for each record.
I suppose this is not mysql specific, but that's what I'm using for my application.
I get back n * m rows for each record, where n is the number of fields, and m is the number of comments. I want to get back n + m rows
SELECT *
FROM record
LEFT JOIN fields ON (fields.record_id = record.id) /* maybe INNER JOIN ? */
LEFT JOIN comments ON (1=0)
UNION ALL
SELECT *
FROM record
LEFT JOIN fields ON (1=0)
LEFT JOIN comments ON (comments.record_id = record.id) /* maybe INNER JOIN ? */
-- ORDER BY record.id