mysql - 如何正确格式化此 MySQL JOIN 语句?

标签 mysql

我有一张看起来像这样的表:

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

这里的关系是表1中的id对应表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   | 

显然,遍历此连接语句会产生 6 个结果,表 2 中与表 1 中的 id 匹配的每一行都会产生 1 个结果。如何使用正确的查询语句避免这种情况?

提前谢谢你。

最佳答案

如果您知道将获得的所有列,则可以使用 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 

希望这对您有所帮助!

关于mysql - 如何正确格式化此 MySQL JOIN 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11232021/

相关文章:

php - 跳过整行,如果使用 PHP foreach 的 MySQL 表中的单元格为 Null

php - Laravel 从数据库中删除行并列出剩余行

MySQL/CakePHP 数据库设计问题

MySQL 多表连接四个表(种族和结果表)

php - ‘where 子句中的未知列?

mysql - 找出球队赢得和输掉比赛的次数?

php - 如何防止 PHP 中的 SQL 注入(inject)?

php - 不将 id 传递给 Laravel 中的模型

mysql - 您的 SQL 语法有误;查看与您的 MySQL 对应的手册

MySQL 定位和反向查询