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

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

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

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

最佳答案

LEFT join 应该在这里解决问题

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

我不确定我是否在 LOGS 和 PEOPLE 之间使用了正确的关系字段,但是通过包含一个 join 子句,其中日志类型是 people 然后你可以看到 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

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

关于SQL条件连接?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11288384/

10-16 14:59