0

ユーザー、ジャーナル、ファイル、フラグ、flag_details の 6 つのテーブルがあります。

users (id, avatar, fullname)
journals (id, container, container_id, user_id, title)
files (id, container, container_id, user_id, title)
flags (id, container, container_id, total)
flag_details (id, container, container_id, reason, comment, user_id)
trend_item (id, container, container_id, user_id)

関係は次のとおりです。

if(flags.container='look') then flags.container_id = journals.id

だから私はジャーナルテーブルからすべてのレコードを取得します

if(flags.container='photo') then flags.container_id = files.id

だから私はファイルテーブルからすべてのレコードを取得します

if(flags.container='trend') then flags.container_id = trend_item.id

だから私はtrend_itemテーブルからすべてのレコードを取得します

したがって、私の見解は次のようになります。

id | container | things      | total flag
1  | look      | 123 - guy   | 2
2  | photo     | 321 - budi  | 4
3  | trend     | 345 - elvis | 3
4  | look      | 876 - cans  | 6

だから私は次のようなクエリを得ました:

SELECT DISTINCT (id), created_at, container, IF( container =  'look', (

SELECT a.container_id
FROM flags a, journals b
WHERE a.container_id = b.id
), IF( container =  'photo', (

SELECT a.container_id
FROM flags a, files b
WHERE a.container_id = b.id
), (

SELECT a.container_id
FROM flags a, trend_items b
WHERE a.container_id = b.id
) ) ) , total, 
`status`
FROM flags
ORDER BY created_at DESC 

しかし、答えはサブクエリが複数行を返すことです。

そのすべてを 1 つのクエリにまとめれば、可能性はありますか?

4

2 に答える 2

0

次のように、これらすべてのテーブルを単一のクエリで安全に結合できると思います。

    SELECT fl.*
      FROM flags fl
 LEFT JOIN journals jo
        ON fl.container_id = jo.id AND fl.container = 'look'
 LEFT JOIN files fi
        ON fl.container_id = fi.id AND fl.container = 'photo'
       ...

これは、概念を説明するためのデモのようなものです。

于 2012-07-06T10:02:06.947 に答える