3

LOGS次の列で呼び出されるテーブルがあります。

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

私が書いているPHPアプリのログを保存します。ただし、SQL クエリですべてのデータを PHP に返して「条件付き」結合を行うことは可能ですか? たとえば、join列に 'people' が含まれている場合は、列fieldを table との関係で結合する必要があることを示します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である結合句を含めると、 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 に答える