MySQL选择行和分组

时间:2019-08-23 11:10:02

标签: mysql database join subquery grouping

我有一个名为field_values的(Joomla)数据库表,内容在下面;

+----+----------+---------+---------+
| id | field_id | item_id | value   |
+----+----------+---------+---------+
| 1  | 2        | 446     | Jones   |
| 2  | 2        | 447     | Smith   |
| 3  | 2        | 448     | Jenkins |
| 4  | 3        | 446     | Paul    |
| 5  | 3        | 447     | Peter   |
| 6  | 3        | 448     | Sally   |
| 7  | 4        | 446     | London  |
| 8  | 4        | 447     | Dublin  |
| 9  | 4        | 448     | Paris   |
+----+----------+---------+---------+

我只显示表中的9行,但是实际上我有数千行,因此成功查询需要考虑到这一点。

各栏说明;

  • id(主要/自动递增)
  • field_id(FK到另一个fields表,2 =姓氏,3 =姓氏,4 =位置)
  • item_id(FK到另一个users表)
  • 值(字段内容)

如何从上表中选择所有值,但显示如下:

+------------+-----------+----------+
| first_name | last_name | location |
+------------+-----------+----------+
| Paul       | Jones     | London   |
| Peter      | Smith     | Dublin   |
| Sally      | Jenkins   | Paris    |
+------------+-----------+----------+

在上面想要的结果中,id字段并不是必需的,我只是添加了此字段以强调每一行都是唯一的。

我不确定是否需要使用子查询或分组依据,也许两者都不用?

谢谢。

2 个答案:

答案 0 :(得分:1)

数据透视查询应该在这里工作:

SELECT
    MAX(CASE WHEN field_id = 3 THEN value END) AS first_name,
    MAX(CASE WHEN field_id = 2 THEN value END) AS last_name,
    MAX(CASE WHEN field_id = 4 THEN value END) AS location
FROM yourTable
GROUP BY
    item_id
ORDER BY 
    item_id;

您当前的表结构是非规范化的键值存储,这是WordPress在某些表中使用的样式。

答案 1 :(得分:0)

您可以避免子查询和混乱。 您可以在同一张表中使用3次

select  a.id, b.value firts_name, a.value last_name , c.value location
from  field_values a 
inner join  field_values b  on a.item_id = b.item_id and b.field_id = 3 
inner join  field_values bc on a.item_id = c.item_id and b.field_id = 4
where a.item_id = 2