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

时间:2013-01-15 13:38:29

标签: 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中的值来选择它们的相关字段,按lang分组。选择表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,但这不是我想要的。

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

由于

1 个答案:

答案 0 :(得分:1)

试试这个:

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的查询中。因为,表id lang中的每个组TableB都有两个值BANNER_TYPE | PRIORITY | TIMING所以您希望每个组都有哪个值?