缺少查询中的值

时间:2016-03-31 13:17:04

标签: mysql

我在以下查询中遇到了一些奇怪的结果:

SET @indi_id = 768;
SET @generations = 8;

SELECT num, sosa, seq, len, dernier, ful_ful_nom 
FROM fullindi 
LEFT JOIN lignee_new 
ON ((ful_indi_id = dernier) AND (len BETWEEN 1 AND @generations)) 
RIGHT JOIN numbers 
ON ((sosa = num) AND (premier = @indi_id)) 
WHERE num BETWEEN 1 AND pow(2, @generations) 
GROUP BY num 
ORDER BY num;

结果如下:

enter image description here

为什么在一个完整的NULL之前的行不会显示现有值&s;' len' len'' dernier',ful_ful_nom&# 39;)但只有' seq'值(请参阅此示例中的行 43 47 )?

我错过了什么?

根据要求,这是数据:

table lignee_new:

enter image description here

表fullindi:

enter image description here

1 个答案:

答案 0 :(得分:1)

问题在于,当引入聚合函数或包含GROUP BY时,MySQL确实很蠢,但并非所有字段都在聚合函数或GROUP BY中。

您要求它GROUP BY num,但SELECT中的其他列都不包含在Group BY中,也不会与函数聚合(SUM,MAX,MIN,AVG等) ..)

在任何其他RDBMS中,此查询都不会运行并且会抛出错误,但MySQL只会继续运行。它使用逻辑来决定它应该为每个不是num的字段显示哪个值,只需抓住它在数据存储中找到的第一个值,这可能在innoDB和其他任何人使用之后不同。

我的猜测是,在你的情况下,lignee_new中有多条记录num为43,因为你GROUP BY num而没有别的,它只是从中随机获取值您的多个记录num=43并显示它们......这是合理的。通过不将它们包含在一个聚合函数中,你几乎都在说“我不关心你为这些其他领域展示什么,只是带回来”,所以MySQL就是这样。

完全删除您的GROUP BY子句,您会看到有意义的数据。也许使用WHERE进一步过滤您的记录以消除空值或其他您不需要的东西(不要使用GROUP BY进行过滤)。