mysql连接2个表以产生以下输出

时间:2016-08-08 02:23:44

标签: mysql

我有两个表:usersuser_fingerprints

table

如何组合这两个表来产生输出?

我试过

select u.id, u.name, 
case f.finger (when 0 then 'y' else 'n' end) '0',
case f.finger (when 1 then 'y' else 'n' end) '1',
case f.finger (when 2 then 'y' else 'n' end) '2',
case f.finger (when 3 then 'y' else 'n' end) '3', 
case f.finger (when 4 then 'y' else 'n' end) '4',
case f.finger (when 5 then 'y' else 'n' end) '5', 
case f.finger (when 6 then 'y' else 'n' end) '6'
from user u left join user_fingerprint f
on u.id=f.user_id
group by u.id

但结果只会从同一个id中获取一行并在输出表中更新它。当我使用max函数时,它有效,但有没有办法不使用max

2 个答案:

答案 0 :(得分:0)

使用聚合函数:

select u.id, u.name, 
       max(case f.finger when 0 then 'y' else 'n' end) as '0',
       max(case f.finger when 1 then 'y' else 'n' end) as '1',
       max(case f.finger when 2 then 'y' else 'n' end) as '2',
       max(case f.finger when 3 then 'y' else 'n' end) as '3', 
       max(case f.finger when 4 then 'y' else 'n' end) as '4',
       max(case f.finger when 5 then 'y' else 'n' end) as '5', 
       max(case f.finger when 6 then 'y' else 'n' end) as '6'
from user u left join
     user_fingerprint f
     on u.id = f.user_id
group by u.id;

我建议你重新考虑使用整数作为列别名。看起来注定要令人困惑。 。 。或者更糟糕的是,难以发现错误。

另请注意,max()的作用是'y' > 'n'。如果您不想依赖它,还有其他方法。

这也假设您希望每列有一个摘要行。否则你可能会想要group_concat()

答案 1 :(得分:0)

不确定为什么你不想使用函数max,没有max我认为你可以这样做:

SELECT 
    u.id, u.name, 
    CASE WHEN LOCATE('0', GROUP_CONCAT(f.finger) THEN 'y' ELSE 'n' END `0`, 
    CASE WHEN LOCATE('1', GROUP_CONCAT(f.finger) THEN 'y' ELSE 'n' END `1`, 
    CASE WHEN LOCATE('2', GROUP_CONCAT(f.finger) THEN 'y' ELSE 'n' END `2`, 
    CASE WHEN LOCATE('3', GROUP_CONCAT(f.finger) THEN 'y' ELSE 'n' END `3`, 
    CASE WHEN LOCATE('4', GROUP_CONCAT(f.finger) THEN 'y' ELSE 'n' END `4`, 
    CASE WHEN LOCATE('5', GROUP_CONCAT(f.finger) THEN 'y' ELSE 'n' END `5`, 
    CASE WHEN LOCATE('6', GROUP_CONCAT(f.finger) THEN 'y' ELSE 'n' END `6`
FROM USER u
LEFT JOIN user_fingerprint f ON u.id = f.user_id
GROUP BY u.id

GROUP_CONCAT将为每个finger汇总所有user并用逗号分隔,然后LOCATE将返回第二个参数中第一个参数的索引。