SQL条件加入?

时间:2012-07-02 05:56:23

标签: sql join

我有一个名为LOGS的表,其中包含以下列:

id - user - object - ref - field - from - to - join - ts

存储我正在编写的PHP应用程序的日志记录。但是,当我将所有数据返回到PHP以进行“条件”连接时,是否有可能在SQL查询中?例如,join列可能包含“人员”,表示field列需要与表people建立关联。

这可能吗?或者我必须在PHP方面这样做吗?

1 个答案:

答案 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

但我可以想象将这样的大量实体表组合起来返回日志可能会导致查询速度变慢。