Mysql根据结果创建虚拟列
我有5张桌子:Mysql根据结果创建虚拟列,mysql,Mysql,我有5张桌子: 用户 用户配置文件 课程 user\u主题 主题 用于为使用此查询的每个用户提取相关主题的: SELECT --snip-- u.id, u.username, u.level, c.name course_expertise, GROUP_CONCAT(s.name ) subjects FROM user_profiles up INNER JOIN users u ON up.user_id = u.id INNER
用户
用户配置文件
课程
user\u主题
主题
用于为使用此查询的每个用户提取相关主题的:
SELECT
--snip--
u.id,
u.username,
u.level,
c.name course_expertise,
GROUP_CONCAT(s.name ) subjects
FROM
user_profiles up
INNER JOIN users u ON up.user_id = u.id
INNER JOIN courses c ON up.course_expertise_id = c.id
INNER JOIN user_subjects us ON u.id = us.user_id
INNER JOIN subjects s ON us.subject_id = s.id
GROUP BY u.id
导致:
+----+-----------+-----------+-----------------------------------+-------------------+
| id | username | level | course_expertise | subjects |
+----+-----------+-----------+-----------------------------------+-------------------+
| 2 | lecturer | lecturer | Information Technology Management | sub1, sub2, sub3 |
| 3 | professor | professor | Information Technology Management | sub4, sub 5, sub6 |
+----+-----------+-----------+-----------------------------------+-------------------+
我有没有办法做到这一点:
+----+-----------+-----------+-----------------------------------+----------+----------+----------+
| id | username | level | course_expertise | subject1 | subject2 | subject3 |
+----+-----------+-----------+-----------------------------------+----------+----------+----------+
| 2 | lecturer | lecturer | Information Technology Management | sub1 | sub2 | sub3 |
| 3 | professor | professor | Information Technology Management | sub4 | sub5 | sub6 |
+----+-----------+-----------+-----------------------------------+--------------------------------+
已编辑
主题
列将始终包含3个主题如果只有3个主题,则它将正常工作
select ID,
username,
level,
name course_expertise,
SUBSTRING_INDEX(subjects,',','1') subject1,
SUBSTRING_INDEX(SUBSTRING_INDEX(subjects,',','2'),',','-1') subject2,
SUBSTRING_INDEX(SUBSTRING_INDEX(subjects,',','3'),',','-1') subject3
from
(
SELECT
u.id,
u.username,
u.level,
c.name course_expertise,
GROUP_CONCAT(s.name ) subjects
FROM
user_profiles lp
INNER JOIN users u ON lp.user_id = u.id
INNER JOIN courses c ON lp.course_expertise_id = c.id
INNER JOIN user_subjects us ON u.id = us.user_id
INNER JOIN subjects s ON us.subject_id = s.id
GROUP BY u.id
) A
更改:
GROUP_CONCAT(s.name ) subjects
max( case when s.name in( 'sub1', 'sub4' ) then s.name else null end ) as 'Subject 1'
, max( case when s.name in( 'sub2', 'sub5' ) then s.name else null end ) as 'Subject 2'
, max( case when s.name in( 'sub3', 'sub6' ) then s.name else null end ) as 'Subject 3'
至:
GROUP_CONCAT(s.name ) subjects
max( case when s.name in( 'sub1', 'sub4' ) then s.name else null end ) as 'Subject 1'
, max( case when s.name in( 'sub2', 'sub5' ) then s.name else null end ) as 'Subject 2'
, max( case when s.name in( 'sub3', 'sub6' ) then s.name else null end ) as 'Subject 3'
总是只有3个主题还是可以增加它们?@MKhalidJunaid总是3..完全一样我要发布:)@MKhalidJunaid:我也可以期待对我的解决方案发表评论吗?:)我现在在外面…我一测试就接受你的答案..谢谢anyway@MKhalidJunaid:好的。我知道使用了
子字符串\u索引
。刚才建议对有限数量的项目使用大小写
。@MKhalidJunaid:Cool。但根据您对其他答案的评论,如果唯一主题的数量有限,这是可以采用的。我现在不知道主题名称,所以我想我不能使用这个