如何正确格式化此MySQL JOIN语句?
我有一张桌子,看起来像: 表1->如何正确格式化此MySQL JOIN语句?,mysql,Mysql,我有一张桌子,看起来像: 表1-> +----+--------+--------+ | id | name | author | +----+--------+--------+ | 1 | First | Me | | 2 | Second | You | +----+--------+--------+ 表2-> +-----+------------+-----------+------------+ | mid | table1_id | key
+----+--------+--------+
| 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 |
+-----+------------+-----------+------------+
这里的关系是表1中的id
对应于表2中的table1\u id
我想要得到的结果是
+----+---------+---------+-------------+-----------+-----------+
| id | name | author | desc | begin_day | end_day |
+----+---------+---------+-------------+-----------+-----------+
| 1 | First | Me | hello | monday | tuesday |
| 1 | Second | You | goodbye | wednesday | friday |
+----+---------+---------+-------------+-----------+-----------+
我尝试了几种不同的join语句——都是下面的变体。然而,我对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 |
显然,迭代这个join语句会产生6个结果,表2中与表1中的id匹配的每一行有1个结果。如何使用适当的查询语句来避免这种情况
提前感谢。如果您知道将获得的所有列,您可以使用案例陈述,如下所示:
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
希望这有帮助 “避免这个…”是什么意思?你期望什么?这很好,我曾考虑使用子查询来实现同样的效果,但我认为这更有效。@AntP我开始准确地编写它,然后意识到表结构意味着只有这3项,这应该需要更少的数据传递。@David Manheim有11行,但我不介意这种解决方案,当我在做
时,如果列value
被命名为item\u value
,并且desc
被命名为item\u desc
,则值结束为desc
,那么,当表2.key='item\u desc'然后item\u值以item\u desc结束时,就会出现的情况,对吗?@David Manheim谢谢你——经过一些修改,这就是解决方案。谢谢。
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;