MySQL 连接和第二个表中的字段作为结果中的列

标签 mysql join

我想知道我的方法是否足够、可行以及我该怎么做?

假设您有 2 个 MySQL 表:

表A

ID   alias     
--   --
11   banner_a
26   banner_b

表B

Column  Type
pid         int(10) 
lang    varchar(2)  
field   varchar(255)    
value   text    

表 B 的示例数据:

id  lang    field               value

26  da      banner_type         single
26  da      priority            5
26  da      timing              5

26  de      banner_type         single
26  de      priority            1
26  de      timing              10

因此,假设我想从表 A 中选择所有/部分记录,以及它们的相关字段以及表 B 中的值,并按语言分组。其中B表中的字段像MySQL中的常规列一样被选择,并且它的值将是字段的值。

期望看到这样的结果:

结果记录1:

id 26
alias banner_b
lang da
banner_type single
priority 5
timing 5

结果记录2:

id 26
alias banner_b
lang de
banner_type single
priority 5
timing 5

几年前我用 COALESCE 做过类似的事情,但这不是我想要的。

如果有的话我应该从哪里开始? :-)

谢谢

最佳答案

试试这个:

SELECT
  b.id, 
  b.lang,
  MAX(CASE WHEN b.field = 'banner_type' THEN b.value END) AS 'banner_type',
  MAX(CASE WHEN b.field = 'priority' THEN b.value END) AS 'priority',
  MAX(CASE WHEN b.field = 'timing' THEN b.value END) AS 'timing'
FROM TableA a
INNER JOIN TableB b ON a.ID = b.ID
GROUP BY b.id, b.lang;

SQL Fiddle Demo

这会给你:

| ID | LANG | BANNER_TYPE | PRIORITY | TIMING |
-----------------------------------------------
| 26 |   da |      single |        5 |      5 |
| 26 |   de |      single |        1 |     10 |

请注意:在查询中我使用了MAX。因为,表 TableB 中的每个组 id lang 的每个 BANNER_TYPE | 都有两个值。优先| TIMING 那么您希望每个组的值是多少?

关于MySQL 连接和第二个表中的字段作为结果中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14338996/

相关文章:

mysql - 让 SQL 计算整个列的总和 - 我相信在分组时遇到问题

SQL查询,连接两个表

mysql - 使用 union all 和内连接创建表

mysql - 使用校验和比较多列上的两个表?

mysql - 选择昨天和一周前的结果

mysql - LOAD DATA INFILE 同一行有数百个警告

mysql - 仅选择 SQL 连接中的特定列并分配 `alias`

mysql - 将帖子从一个博客复制到另一个博客后出现 W3C RSS 错误

mysql - Eureka 的 hsqldb 覆盖 MySQL

mysql - 如何解决子查询返回多于 1 行的错误