3

我有一个名为LOGS以下列的表:

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

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

这可能吗?还是我必须在 PHP 端这样做?

4

1 回答 1

4

一个左连接应该在这里做的伎俩

select * 
from
    LOGS l
left join 
    PEOPLE p on p.peopleid = l.field and l.join = 'people'

我不确定我是否在 LOGS 和 PEOPLE 之间使用了正确的关系字段,但是通过在日志类型为 people 的位置包含 join子句,您可以看到有条件地返回 PEOPLE 条目。

当您想有条件地从不同的表中返回时,事情会变得更加复杂,因为您需要确保实体表带来的额外字段相​​同(或至少被标识为相同)。在这种情况下,您被迫 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

但我可以想象像这样组合许多实体表来返回日志可能会导致查询速度非常慢。

于 2012-07-02T06:01:00.683 回答