SQL Выбор максимального значения 4 соединения - PullRequest
0 голосов
/ 05 марта 2020

Я застрял с этим запросом. Я хочу получить следующую информацию из моей базы данных:

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

Но почему-то я получаю правильный вес -> макс (Gewicht), но не тот пользователь.

Что я делаю не так?

Вот снимок экрана с дизайном моей базы данных: Database Design

РЕДАКТИРОВАТЬ: При использовании каждого столбца в моем Сгруппировать по я получаю несколько столбцов, как это:

Example

Но я просто хочу, чтобы один посередине был с самым высоким Gewicht.

Пример того, что я хочу:

Example2

Это полный набор результатов после присоединения информации, которую я хочу. Теперь я просто хочу, чтобы линии были отмечены красным. Некоторые строки имеют одинаковый «max (gewicht)», независимо от того, какую из них выбрать.

Ответы [ 3 ]

2 голосов
/ 05 марта 2020

Вы должны использовать все столбцы в 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
0 голосов
/ 05 марта 2020

Я думаю, что вы просто ищете запись с максимальным значением для каждого убида:

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-скрипку, в этом примере все работает нормально:

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
0 голосов
/ 05 марта 2020

Ваш запрос выполняется, но он некорректен.

Столбцы, не указанные в предложении GROUP BY, должны быть агрегированы. MariaDB (и MySQL) печально известны тем, что в предложении SELECT допускаются неагрегированные столбцы.

Solution : просто добавьте все неагрегированные столбцы в предложение GROUP BY в решить вашу проблему, как в:

GROUP BY a1.UBID, a3.Datum, a4.username, a2.Name, Wiederholungen

Как есть, MariaDB выбирает значения случайным образом . Сегодня вы видите неправильные значения, но, возможно, завтра они хороши. Вы не хотите, чтобы запрос вел себя так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...