Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL选择行和分组_Mysql_Database_Join_Subquery_Grouping - Fatal编程技术网

MySQL选择行和分组

MySQL选择行和分组,mysql,database,join,subquery,grouping,Mysql,Database,Join,Subquery,Grouping,我有一个名为field\u values的(Joomla)数据库表,内容如下 +----+----------+---------+---------+ | id | field_id | item_id | value | +----+----------+---------+---------+ | 1 | 2 | 446 | Jones | | 2 | 2 | 447 | Smith | | 3 | 2 | 448

我有一个名为
field\u 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(主/自动增量)
  • 字段id(FK到另一个
    字段
    表,
    2
    =姓氏,
    3
    =名字,
    4
    =位置)
  • 项目id(FK到另一个
    用户
    表)
  • 值(字段的内容)
如何从上表中选择所有值,但显示如下:

+------------+-----------+----------+
| first_name | last_name | location |
+------------+-----------+----------+
| Paul       | Jones     | London   |
| Peter      | Smith     | Dublin   |
| Sally      | Jenkins   | Paris    |
+------------+-----------+----------+
在上面想要的结果中,
id
字段并不是必需的,我只是添加它来强调每一行都是唯一的

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


提前感谢。

您可以通过以下方式避免子查询和分组。 你可以使用同一张桌子三次

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 

pivot查询应在以下位置工作:

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在其某些表中使用这种样式。

我真的不理解结果集中
id
的含义您的意思是说您希望数据透视输出中有数千列吗?我上面所写的是在不使用动态SQL的情况下所能做的最好的事情,例如在存储过程中。@TheoredinaryGeek如果您有数千个不同的实体(item_id),上面的工作就可以了。对于数以千计的不同属性(FieldIdID),请考虑在应用程序代码中管理这些属性。无论如何,现在你知道谷歌的术语了!好的…你有数千个用户,数千个属性,还是两者都有?