1

次のようなテーブルがあります。

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

ここでの関係は、idinテーブル1がinテーブル2に対応することtable1_idです。

私が取得しようとしている出力は...

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

明らかに、この結合ステートメントを繰り返すと、テーブル1のIDと一致するテーブル2の各行に1つずつ、合計6つの結果が生成されます。適切なクエリステートメントを使用してこれを回避するにはどうすればよいですか。

前もって感謝します。

4

2 に答える 2

2

次のように、取得するすべての列がわかっている場合は、caseステートメントを使用できます。

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 

お役に立てれば!

于 2012-06-27T17:50:55.457 に答える
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;
于 2012-06-27T18:19:26.750 に答える