对行进行分组但保持值不为空

时间:2015-10-18 19:05:33

标签: mysql select group-by

我正在尝试在MySQL中对行进行分组,但结果却是错误的结果。

我的数据库看起来像这样: ScreenDump

我正在使用此查询:

SELECT 
    r_id, va_id,va_klasse,va_periode, 
    1va_mer,1va_hjem,1va_mot,1va_bil,1va_fit,1va_hand,1va_med,1va_fra, 
    2va_mer,2va_hjem,2va_trae,2va_bil,2va_sty,2va_mus,2va_med,2va_fra,
    3va_mer,3va_hjem,3va_mot,3va_bil,3va_pima,3va_nat,3va_med,3va_fra,
    va_lock, va_update

FROM o6hxd_valgfag
WHERE va_klasse IN('7A','7B','7C','8A','8B','8C','9A','9B','9C')
GROUP BY va_id
ORDER BY va_klasse,va_name

这会产生错误的结果,其中返回一行只有前三个数字123而不是第二行和第三行中的数字。 我想要的是将数字123,321和132收集在一行中的结果。

如果这还不够,我可以解释得更详细。

3 个答案:

答案 0 :(得分:2)

如果跨越这些字段应该只有一个值,那么你应该将它们全部放在同一个记录中,然后修复它以插入和更新相同的记录。

即我知道您的数据库设计不正确 然而 我猜想,为了解决这个问题,你可以解决这个问题。

SELECT 
    r_id, va_id,va_klasse,va_periode, 
    MAX(1va_mer),MAX(1va_hjem),MAX(1va_mot),MAX(1va_bil),MAX(1va_fit),MAX(1va_hand),MAX(1va_med),MAX(1va_fra), 
    MAX(2va_mer),MAX(2va_hjem),MAX(2va_trae),MAX(2va_bil),MAX(2va_sty),MAX(2va_mus),MAX(2va_med),MAX(2va_fra),
    MAX(3va_mer),MAX(3va_hjem),MAX(3va_mot),MAX(3va_bil),MAX(3va_pima),MAX(3va_nat),MAX(3va_med),MAX(3va_fra),
    va_lock, va_update

FROM o6hxd_valgfag
WHERE va_klasse IN('7A','7B','7C','8A','8B','8C','9A','9B','9C')
GROUP BY va_id
ORDER BY va_klasse,va_name

答案 1 :(得分:1)

您的查询无法按预期运行。想想这个用例:

如果对于row1 (r_id =9),字段2va_sty, 2va_mus, 2va_med不为空且有值?

在这种情况下,你想要的输出应该是什么?当然不能将数字123,321和132聚集在一行中。如果您想使用针对特定字段值执行的聚合函数,则通常会使用分组依据va_id

答案 2 :(得分:0)

不是你的问题的解决方案,但我认为更好的查询将是这样的(因为组by by https://dev.mysql.com/doc/refman/5.5/en/group-by-handling.html中没有命名的列):

SELECT 
    aa.r_id, aa.va_id, aa.va_klasse, aa.va_periode, 
    aa.1va_mer, aa.1va_hjem, aa.1va_mot, aa.1va_bil, aa.1va_fit, aa.1va_hand, aa.1va_med, aa.1va_fra, 
    aa.2va_mer, aa.2va_hjem, aa.2va_trae, aa.2va_bil, aa.2va_sty,2va_mus, aa.2va_med, aa.2va_fra,
    aa.3va_mer, aa.3va_hjem, aa.3va_mot, aa.3va_bil, aa.3va_pima, aa.3va_nat, aa.3va_med, aa.3va_fra,
    aa.va_lock, aa.va_update
FROM o6hxd_valgfag AS aa
INNER JOIN (
    SELECT va_id
    FROM o6hxd_valgfag
    GROUP BY va_id
) AS _aa
ON aa.va_id = _aa.va_id
WHERE aa.va_klasse IN ('7A','7B','7C','8A','8B','8C','9A','9B','9C')
ORDER BY aa.va_klasse, aa.va_name;