问题描述
假设我有一个主表record
,它有2个相关表fields
和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)
我想运行一个查询,该查询获取一组记录,并获取该记录的所有相关字段,并获取与该记录相关的所有注释。
如果我做左联接以确保获得记录,则将使用:
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
问题是,我为每条记录取回n * m行,其中n是字段数,m是注释数。我想返回n + m行(有意义的是,在返回注释时字段列全为null,而在返回字段时注释列全为null)。除了插入要加入的虚拟注释和虚拟字段之外,还有什么方法可以使这项工作有效?我非常希望不必为每个记录执行额外的查询。
我想这不是特定于MysqL的,但这就是我在应用程序中使用的。
解决方法
我为每条记录取n * m行,其中n是字段数,m是注释数。我想找回n + m行
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
,
我想返回n + m行(有意义的是,返回注释时字段列全为空,而返回字段时注释列全为空)
一个选项在子查询中使用union all
,然后在left join
中使用
select *
from record r
left join (
select record_id,name,val,null who,null comment from fields
union all record_id,select null,null,who,comment from comments
) x on x.record_id = r.record_id
那是一个奇怪的结果集。