mysql-从多个表中获取相关行,而没有所有组合

问题描述

假设我有一个主表record,它有2个相关表fieldscomments

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

那是一个奇怪的结果集。