我在以下查询中遇到了一些奇怪的结果:
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;
结果如下:
为什么在一个完整的NULL之前的行不会显示现有值&s;' len' len'' dernier',ful_ful_nom&# 39;)但只有' seq'值(请参阅此示例中的行 43 和 47 )?
我错过了什么?
根据要求,这是数据:
table lignee_new:
表fullindi:
答案 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
进行过滤)。