我有一个名为LOGS
的表,其中包含以下列:
id - user - object - ref - field - from - to - join - ts
存储我正在编写的PHP应用程序的日志记录。但是,当我将所有数据返回到PHP以进行“条件”连接时,是否有可能在SQL查询中?例如,join
列可能包含“人员”,表示field
列需要与表people
建立关联。
这可能吗?或者我必须在PHP方面这样做吗?
答案 0 :(得分:4)
LEFT join应该在这里做到这一点
select *
from
LOGS l
left join
PEOPLE p on p.peopleid = l.field and l.join = 'people'
我不确定我是否在LOGS和PEOPLE之间使用了正确的关系字段,但是通过包含 join的子句,其中日志类型为人,那么您可以看到有条件地返回PEOPLE条目。 / p>
当您想要从不同的表中有条件地返回时,事情变得更加复杂,因为您需要确保实体表引入的额外字段是相同的(或者至少被识别为相同)。在这种情况下,你被迫加入UNION结果。
select
l.*,
p.peopleid as entityid,
p.fullname as displayname
from
LOGS l
left join
PEOPLE p on p.peopleid = l.field and l.join = 'people'
union all
select
l.*,
a.accountid as entityid,
p.accountname as displayname
from
LOGS l
left join
ACCOUNT a on a.accountid = l.field and l.join = 'account'
或者这个
select
l.*,
entity.entityid as entityid,
entity.displayname as displayname
from
LOGS l
left join
(
select 'people' as type, p.peopleid as entityid, p.fullname as displayname
from PEOPLE
union all
select 'account', a.accountid, p.accountname
from ACCOUNT
) entity on entity.type = l.join and entity.entityid = l.field
但我可以想象将这样的大量实体表组合起来返回日志可能会导致查询速度变慢。