[英]SQL Selecting Max Value 4 Joins
我被这个查询困住了。 我想从我的数据库中获取以下信息:
User.username、Satz.Gewicht、Satz.Wiederholungen、ubungen.Name 和 Training.Datum
线索是,我想为每个不同的练习 (ubungen.id) 获取此列。
我试过这个:
SELECT
a3.Datum,
a4.username,
a2.Name,
max(Gewicht) as Gewicht,
Wiederholungen
from satz a1
INNER JOIN ubungen a2 ON a1.UBID = a2.ID
INNER JOIN training a3 ON a1.TID = a3.ID
INNER JOIN user a4 ON a3.UID = a4.ID
GROUP BY a1.UBID
但不知何故,我得到了正确的 Weight -> max(Gewicht) ,但错误的用户。
我究竟做错了什么?
编辑:当使用我的组中的每一列时,我得到多列,如下所示:
但我只想要中间的那个是 Gewicht 最高的那个。
我想要的例子:
这是加入我想要的信息后的整个结果集。 现在我只想要标有红色的线条。 有一些行具有相同的“max(gewicht)”,无论选择哪一行。
您必须使用GROUP BY
除聚合函数列之外的所有列
试试这个:
SELECT
a3.Datum, a4.username, a2.Name, max(Gewicht) as Gewicht, Wiederholungen
FROM satz a1
INNER JOIN ubungen a2
ON a1.UBID = a2.ID
INNER JOIN training a3
ON a1.TID = a3.ID
INNER JOIN user a4
ON a3.UID = a4.ID
GROUP BY
a3.Datum, a4.username, a2.Name, Wiederholungen
您的查询运行,但格式错误。
没有在GROUP BY
子句中指定的列应该被聚合。 MariaDB(和 MySQL)因在SELECT
子句中允许非聚合列而臭名昭著。
解决方案:只需将所有非聚合列添加到GROUP BY
子句即可解决您的问题,如下所示:
GROUP BY a1.UBID, a3.Datum, a4.username, a2.Name, Wiederholungen
实际上,MariaDB 正在随机选择值。 今天你看到了错误的价值观,但也许明天它们是好的。 您不希望查询行为像这样。
我认为您只是在寻找每个 ubid 具有最大值的记录:
select x.Ubid,x.Datum,x.username,x.name,x.Gewicht,x.Wiederholungen
from
(SELECT
a1.Ubid,
a3.Datum,
a4.username,
a2.Name,
Gewicht,
Wiederholungen,
row_number() over (partition by a1.ubid order by Gewicht desc) as rownum1
from satz a1
INNER JOIN ubungen a2 ON a1.UBID = a2.ID
INNER JOIN training a3 ON a1.TID = a3.ID
INNER JOIN user a4 ON a3.UID = a4.ID ) x
where x.rownum1=1
我已经使用 row_number 函数来提取具有最高 Gewicht 值的记录。 希望这可以帮助。
编辑:添加一个 db-fiddle,它在这个例子中工作正常:
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=0ac9caf422a06feb6e7c05c1a68995f5
由于 row_number 不起作用,您可以使用内部联接来获取最大值:
select x.Ubid,x.Datum,x.name,x.Gewicht,max(x.Wiederholungen) as Wiederholungen,max(x.username) as username
from
(SELECT
a1.Ubid,
a3.Datum,
a4.username,
a2.Name,
a1.Gewicht,
a1.Wiederholungen
from satz a1
INNER JOIN ubungen a2 ON a1.UBID = a2.ID
INNER JOIN training a3 ON a1.TID = a3.ID
INNER JOIN user a4 ON a3.UID = a4.ID ) x
INNER JOIN
(select ubid,max(Gewicht) as max_Gewicht from satz group by ubid) y
ON x.ubid=y.ubid and x.Gewicht=y.max_Gewicht
Group by x.Ubid,x.Datum,x.name,x.Gewicht
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.