Php 是否可以使用MySQL以这种方式对行进行分组?
我有一个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 到目前为止,我只是使用下面的查
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个以上的值一起使用,因为每个新列都需要一个联接。