2016-10-29 3 views
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  | 
+----+----------+------------+ 

Out-горшок, что я хочу:

+----+-------------+--------+-------+ 
| 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 

Первый JOIN будет использоваться для заполнения данных для столбца meta_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 
Смежные вопросы