MySQL左外连接问题

时间:2017-09-26 17:46:21

标签: mysql left-join

我有一个表wmeta项目的元数据:(某些项目缺少数据)简化示例:

 id | item_id | meta_key    | meta_value
 1  |100      |first_name   |Joe
 2  |100      |last_name    |Bloggs
 3  |100      |age          |21
 4  |101      |first_name   |Fred
 5  |101      |last_name    |Smith
 6  |102      |first_name   |Jane
 7  |102      |last_name    |Doe
 8  |102      |age          |22

如果我有另一张表wfields并带有所有键

id |meta_name
 1 |first_name
 2 |last_name
 3 |age

使用下面的查询我没有得到我期望的缺失年龄记录的空值。

SELECT wf.meta_name, wm.item-id, wm.meta_value 
FROM wfields as wf 
LEFT JOIN wmeta as wm 
ON wf.meta_name = wm.meta_key

我想要的输出用于表格显示/导出到csv

100 | Joe Bloggs 22  
101 | Fred Smith ''  
102 | Jane Doe   21

3 个答案:

答案 0 :(得分:1)

为获取相同行上每个item_id的结果,你应该使用group_concat(没有aggreagtion的连接返回几行的值)

SELECT item_id, 
GROUP_CONCAT( meta_value ORDER BY field(meta_key, 'first_name', 'last_name', 'age' ) SEPARATOR ' ')
FROM wfields as wf 
LEFT JOIN wmeta as wm ON wf.meta_name = wm.meta_key
GROUP BY item_id

答案 1 :(得分:1)

你只需要转动你的桌子:

SELECT item_id,
        MAX(IF(meta_key = 'first_name', meta_value, '')) AS first_name,
        MAX(IF(meta_key = 'last_name', meta_value, '')) AS last_name,
        MAX(IF(meta_key = 'age', meta_value + 0, NULL)) AS age
FROM wmeta
GROUP BY item_id

如果您需要动态获取列,请参阅此处的答案:MySQL pivot table

您还可以先交叉加入元键和项目ID列表,然后将其与wmeta表格一起加入:

SELECT x.item_id, x.meta_name, m.meta_value
FROM (SELECT DISTINCT item_id, meta_name
      FROM wmeta
      CROSS JOIN wfields) AS x
LEFT JOIN wmeta AS m
ON m.item_id = x.item_id AND m.meta_key and x.meta_name
ORDER BY x.item_id, x.meta_name

这将获取所有空值,但每个属性将位于单独的行上。

答案 2 :(得分:0)

您正在寻找的是一个FULL OUTER JOIN,它将一个表的所有记录与另一个表联系起来,无论是否有链接。