考虑以下三个表:
t1(id,name,cDate,foo,…)
t2(id,name,cDate,bar,…)
t3(id,name,cDate,other,…)
这些表代表一些独立的实体.我需要在站点主页上显示它们,无论它们在按创建日期排序的列表中的类型(cDate).
rows
---
t1
t2
t2
t3
t2
t1
目前我已经通过联合创建了一个视图(或子查询)的一些共享列和一个用于表名的辅助列:v1(id,cDate,tableName)来选择它们按cDAte排序.之后,我在每个表上查询以获取表的行,并将结果合并到PHP数组中并将它们发送回查看.但是我认为它不那么高效和干净.有没有更好的方法?
解决方法:
作为@John Green答案的改进,我使用COALESCE函数创建了一个SQL fiddle,它返回第一个非null参数:
SELECT COALESCE(t1.id, t2.id, t3.id) id
, COALESCE(t1.name, t2.name, t3.name) name
, COALESCE(t1.cDate, t2.cDate, t3.cDate) cDate
, COALESCE(t1.foo, t2.bar, t3.other) uniqueField
FROM (
SELECT 't1' AS source, id FROM t1
UNION
SELECT 't2' AS source, id FROM t2
UNION
SELECT 't3' AS source, id FROM t3
) ad
LEFT JOIN t1 ON ad.id = t1.id AND ad.source = 't1'
LEFT JOIN t2 ON ad.id = t2.id AND ad.source = 't2'
LEFT JOIN t3 ON ad.id = t3.id AND ad.source = 't3'
ORDER BY cDate
使用此方法的优点是,您可以按照业务规则所需的方式组合所有表中不常见的字段,如uniqueField中所示