我正在处理一个具有键值对的查询
学生
StdId StuName phnNum
1 John 87678
学生元数据
S.NO field_name field_value StdId
1 college St.Anns 1
2 Address Arizona 1
3 IdNum 321 1
4 Subject Maths 1
5 Marks 90 1
6 Subject Physics 1
7 Marks 80 1
我想从student_meta_data表中获取数据,为此我编写了如下查询,
select
case when student_meta_data.field_name = 'Subject' Then field_value end as subject
case when student_meta_data.field_name ='Marks' Then field_value end as marks
case when student_meta_data.field_name = 'IdNum' Then field_value end as IdNum
from student_meta_data
where student_meta_data.StdId=1
&& student_meta_data.field_name in ('Subject')
对于上述查询,我正在获取如下所示的记录,
subject marks IdNum
null null null
我希望获取如下所示的记录,
subject marks IdNum
Maths 90 321
Physics 80 321
你能对此提出建议吗?提前致谢。
最佳答案
SELECT rn,
MAX(subject) as subject,
MAX(case when field_name = 'Marks' Then field_value end) as marks,
MAX(idNum) as idNum
FROM ( SELECT m.*,
@idNum := if(`field_name` = 'IdNum', `field_value`, @idNum) as idNum,
@subject := if(`field_name` = 'Subject', `field_value`, @subject) as subject,
@rn := if (@s = @subject,
@rn,
if(@s := @subject, @rn+1, @rn+1)
) as rn
FROM student_meta_data m
CROSS JOIN (SELECT @idNum := 0, @rn := 0, @subject := '', @s := '' ) as var
ORDER BY `SNO` ) as T
WHERE rn > 0
GROUP BY rn;
输出
使用变量来跟踪 idNum 并为每个主题创建组。第一个查询只是调试建议的内部子查询,最后一个查询是您想要的结果
关于mysql - 当表有键值对时如何在sql查询中使用IN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47039971/