繁体   English   中英

SQL 选择最大值 4 连接

[英]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 最高的那个。

我想要的例子:

例2

这是加入我想要的信息后的整个结果集。 现在我只想要标有红色的线条。 有一些行具有相同的“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM