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

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...