2016-10-29 17 views
2

2つのテーブルを結合したい、最初のテーブルから1つのレコードを読み込み、2つ目のテーブルから2つのレコードを読み込みます。最初のテーブルには、すべてを選択したいフィールドがあります。 2番目のテーブルは、外部キーを使用して1番目のテーブルに接続されています。2つのテーブルを結合し、2つ目のテーブルから2つのレコードを読み込みます。

まずテーブル:

+----+-------------+ 
| id | some_fields | 
+----+-------------+ 
| 23 | S.T  | 
+----+-------------+ 
| 24 | S.T  | 
+----+-------------+ 
| 25 | S.T  | 
+----+-------------+ 

セカンドテーブル

+----+----------+------------+ 
| fid| meta_key | meta_value | 
+----+----------+------------+ 
| 24 | meta_1 | m_1  | 
+----+----------+------------+ 
| 24 | meta_2 | m_2  | 
+----+----------+------------+ 
| 25 | meta_2 | m_3  | 
+----+----------+------------+ 

私が欲しいアウトポット:

+----+-------------+--------+-------+ 
| id | some_fields | meta_1 | meta_2| 
+----+-------------+--------+-------+ 
| 24 |  S.T  | m_1 | m_2 | 
+----+-------------+--------+-------+ 
| 25 |  S.T  | null | m_3 | 
+----+-------------+--------+-------+ 

私は、このクエリが間違っている知っている:

SELECT * 
    FROM posts 
    INNER JOIN postmeta ON (posts.id = postmeta.fid) 
    WHERE 1 =1 
    AND (
    postmeta.meta_key = 'meta_1' 
    OR postmeta.meta_key = 'meta_2' 
    ) 
    AND posts.post_type = 'ignition_product' 
    AND (
    posts.post_status = 'publish' 
    OR posts.post_status = 'private' 
    ) 
    GROUP BY posts.ID 
    ORDER BY postmeta.meta_value +0 DESC 
    LIMIT 0 , 7 

答えて

3

使用し、複数のpostmetaテーブルに結合します。

SELECT posts.id, posts.some_fields, meta1.meta_value as meta_1, meta2.meta_value as meta_2 
FROM posts 
    LEFT JOIN postmeta meta1 ON posts.id = meta1.fid AND meta_key = 'meta1' 
    LEFT JOIN postmeta meta2 ON posts.id = meta2.fid AND meta_key = 'meta2' 
WHERE meta1.fid IS NOT NULL OR meta2.fid IS NOT NULL 

まずJOINmeta_1のデータを移入するために使用され、第二の参加 - 列meta_2を移入。

上記のクエリは、メタタイプが2種類しかない場合に有効です。より多くの、または番号が動的である場合、異なるアプローチが必要です。

3

はピボットクエリを使用します。

SELECT t1.id, 
     t1.some_fields, 
     t2.meta_1, 
     t2.meta_2  
FROM posts t1 
LEFT JOIN 
(
    SELECT fid, 
      MAX(CASE WHEN meta_key = 'meta_1' THEN meta_value END) AS meta_1, 
      MAX(CASE WHEN meta_key = 'meta_2' THEN meta_value END) AS meta_2 
    FROM postmeta 
    GROUP BY fid 
) t2 
    ON t1.id = t2.fid 
関連する問題