2012-06-27 2 views
1

У меня есть таблица, которая выглядит как:Как правильно форматировать это заявление MySQL JOIN?

Таблица 1 ->

+----+--------+--------+ 
| id | name | author | 
+----+--------+--------+ 
| 1 | First | Me | 
| 2 | Second | You | 
+----+--------+--------+ 

Таблица 2 ->

+-----+------------+-----------+------------+ 
| mid | table1_id | key | value | 
+-----+------------+-----------+------------+ 
| 1 |  1  | desc | hello | 
| 2 |  1  | begin_day | monday | 
| 3 |  1  | end_day | tuesday | 
| 4 |  2  | desc | goodbye | 
| 5 |  2  | begin_day | wednesday | 
| 6 |  2  | end_day | friday | 
+-----+------------+-----------+------------+ 

Отношения здесь является то, что id в таблице 1 соответствует table1_id в таблице 2.

Выход, который я пытаюсь получить, это ...

+----+---------+---------+-------------+-----------+-----------+ 
| id | name | author |  desc | begin_day | end_day | 
+----+---------+---------+-------------+-----------+-----------+ 
| 1 | First | Me | hello | monday | tuesday | 
| 1 | Second | You | goodbye | wednesday | friday | 
+----+---------+---------+-------------+-----------+-----------+ 

Я пробовал несколько разных заявлений о присоединении - все варианты ниже. Однако я не так хорошо разбираюсь в MySQL-запросах.

SELECT * FROM table_1 LEFT JOIN table_2 on table_1.id = table_2.table1_id 

Которая производит ...

+----+----------+----------+----------+------------+-----------+ 
| id | mid | name | author | key  | value | 
+----+----------+----------+----------+------------+-----------+ 
| 1 |  1 | First | Me | desc | hello | 
| 1 |  2 | First | Me | begin_day | monday | 
| 1 |  3 | First | Me | end_day | tuesday | 
| 2 |  4 | Second | You | desc | goodbye | 
| 2 |  5 | Second | You | begin_day | wednesday| 
| 2 |  6 | Second | You | end_day | friday | 

Очевидно, что итерация этого присоединиться к заявлению производит 6 результатов, 1 для каждой строки в таблице 2, которая соответствует идентификатору в таблице 1. Как я могу избежать этого с правильной формулировкой запроса?

Заранее спасибо.

+0

Что вы имеете в виду «избегать этого .....», что вы ожидаете? – jcho360

ответ

2

Вы можете использовать случай заявление, если вы знаете, все колонки, которые вы будете получать, следующий образ:

Select distinct table_1.*, 
case when table_2.key='desc' then value end as desc, 
case when table_2.key='begin_day' then value end as begin_day, 
case when table_2.key='end_day' then value end as end_day 
    FROM table_1 LEFT JOIN table_2 on table_1.id = table_2.table1_id 

Надеется, что это помогает!

+1

Я сейчас дам ему выстрел и дам вам знать, что я нахожу. – Ohgodwhy

+0

Это довольно приятно, я рассматривал возможность использования подзапросов для достижения такого же эффекта, но я думаю, что это намного эффективнее. –

+0

@AntP Я начал писать именно это, а затем понял, что структура таблицы подразумевает, что есть только эти 3 элемента, и это должно потребовать меньше проходов через данные. –

0
SELECT 
table_1.*, 
MAX(IF(key='desc', value, NULL)) AS 'desc', 
MAX(IF(key='begin_day', value, NULL)) AS begin_day, 
MAX(IF(key='end_day', value, NULL)) AS end_day 
FROM table_1 
LEFT JOIN table_2 ON (id = table1_id) 
GROUP BY id; 
Смежные вопросы