微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 以有效的方式对来自三个不同表的数据进行排序和合并

考虑以下三个表:

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中所示

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐