Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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
Php 是否可以使用MySQL以这种方式对行进行分组?_Php_Mysql_Sql - Fatal编程技术网

Php 是否可以使用MySQL以这种方式对行进行分组?

Php 是否可以使用MySQL以这种方式对行进行分组?,php,mysql,sql,Php,Mysql,Sql,我有一个MySQL表,如: ID, USER, PARAM, VAL -------------------- 1 | 1 | NAME | ADAM 2 | 1 | AGE | 15 3 | 2 | NAME | EVA 4 | 2 | AGE | 16 5 | 3 | NAME | CRISS 6 | 3 | AGE | 14 我很好奇是否有一个查询会给我类似的信息: 1 | ADAM | 15 2 | EVE | 16 3 | CRISS| 14 到目前为止,我只是使用下面的查

我有一个MySQL表,如:

ID, USER, PARAM, VAL
--------------------
1 | 1 | NAME | ADAM
2 | 1 | AGE  | 15
3 | 2 | NAME | EVA
4 | 2 | AGE  | 16
5 | 3 | NAME | CRISS
6 | 3 | AGE  | 14
我很好奇是否有一个查询会给我类似的信息:

1 | ADAM | 15
2 | EVE  | 16
3 | CRISS| 14
到目前为止,我只是使用下面的查询并在循环中对记录进行分组

SELECT * FROM table WHERE PARAM ='NAME' OR PARAM = 'AGE'

我尝试使用
,但没有成功。

您可以这样做:

SELECT t1.user,
        (
           SELECT val FROM tab1 t2 
           WHERE t2.user = t1.user 
             AND t2.param = 'Name'
        ) name,
        (
           SELECT val FROM tab1 t2 
           WHERE t2.user = t1.user 
             AND t2.param = 'Age'
        ) age
    FROM tab1 t1
    GROUP BY user
另一种可能是group_concat,但您可以在一列中侦听所有值

SELECT user, group_concat(param, ':', val)
    FROM tab1
    GROUP BY user

在同一个表上使用join:

选择a.USER-id、a.VAL-USER-name、b.VAL-USER-age
从'table'a
a.USER=b.USER上的内部联接`table`b
其中a.PARAM='NAME'
b.PARAM='AGE'
结果:

user_id     user_name   user_age
1           ADAM        15
2           EVA         16
3           CRISS       14

您好,我在我的db示例中复制了您的问题,请尝试以下查询:

    SELECT t1.USER,VAL,(SELECT VAL AS AGE FROM table1 where USER = t1.USER AND PARAM = 'AGE') as AGE 
    FROM table1 t1
    WHERE param = 'NAME'
或者在您的表上使用join:

SELECT a.USER, a.VAL, b.VAL
FROM table1  t1
INNER JOIN table1 t2 
ON t1.USER = t2.USER
WHERE t1.PARAM = 'NAME'
AND t2.PARAM = 'AGE'

用您的表名替换表1。

您可以使用最常用的技术生成透视图,如

select
user,
max(case when param = 'NAME' then val end) as name,
max(case when param = 'AGE' then val end) as age
from mytable
group by user

没有必要使用JOIN。试试这个:

SELECT USER,
       MAX(CASE PARAM WHEN 'NAME' THEN VAL ELSE NULL END) AS NAME,
       MAX(CASE PARAM WHEN 'AGE' THEN VAL ELSE 0 END) AS AGE
FROM test 
GROUP BY USER;

你为什么要这样布置桌子?真讨厌。说真的。@SBI很普通-看。@Boristeider哦,我完全知道这一点。但这并没有改变我对它的看法。不能因为人们在使用它就让它变得更好。这完全是对关系数据库在优化、简洁查询等方面提供的功能的滥用。这正是许多数据库试图避免/绕过它的原因(mssql中的稀疏列、带有xpath子查询的postgres)。不可能!你的数据有“Eva”和“Eve”。我们不是奇迹工作者:-)这是有效的,我有时也会使用它,例如在ETL的数据转换中。您可以使其更短、更具可读性删除
ELSE NULL
(并考虑可读性,添加一些换行符)我已经使用了这两种查询方式来解决这个问题,我可以说,在我看来,这两种方式都更快、更具可读性,特别是当您有很多用户属性要检查时。
ELSE NULL
是无用的,但是
ELSE 0
在某些情况下可能是错误的。现在投票给@Abhik chakraborty这是一个比max/group by更好的方法。@SalmanA为什么?恐怕更糟了。尝试将其与1或2个以上的值一起使用,因为每个新列都需要一个联接。