2013-03-08 2 views
-1

У меня есть тест, где люди подают его, а затем секунды, которые они использовали для завершения теста, также отправляются.SQL-запрос, не упорядочивающий право

Это запрос:

SELECT * 
FROM namethatchampion_stats 
GROUP BY user 
ORDER BY seconds ASC 
LIMIT 100 

Это структура таблицы:

id | user | seconds | time 

Я хочу, чтобы мои пользователи имели возможность представить тест много раз, но это только перечисляет он в первый раз Отправлено. Поэтому, если пользователь получает лучшее время в секундах, когда он публикует сообщения, он не будет использовать эту строку в базе данных, он будет использовать только первую строку, которую разместил пользователь.

+0

Вы хотите получить лучший результат для каждого учащегося? Или первый?Или последний отправлен? –

+0

Какие данные хранится в столбце секунд и какие данные хранится в столбце времени? – Eugene

+0

Я не могу понять, слишком много примеров на сайтах mysql dev ... слишком сложно для Google? –

ответ

0

В вашем заявлении ORDER BY должен использоваться столбец time, содержащий дату их испытаний, а не seconds. (Предполагая, что он содержит полную дату. Если это только время, то это выходит из окна).

0

Это поможет вам лучшее время для каждого пользователя:

SELECT user, MIN(seconds) 
FROM namethatchampion_stats 
GROUP BY user 
LIMIT 100; 

это то, что вы хотели?

1

Я предполагаю, что вы хотите получить лучшие баллы от каждого ученика - а это «лучшим» вы мин MIN(seconds). Если это то, что вы хотите, вот так:

SELECT user, MIN(seconds) AS best_score 
FROM namethatchampion_stats 
GROUP BY user 
ORDER BY best_score ASC 
    LIMIT 100 ; 
2

Я бы посоветовал, чтобы избежать неявной группировки, предлагаемый MySQL, где это возможно, при этом я имею в виду, что ваш запрос позволил выбрать ID, Time и seconds , хотя они не содержатся в агрегатной функции или клаузе group by.

В этом заявлении:

SELECT * 
FROM namethatchampion_stats 
GROUP BY User 
ORDER BY Seconds 

Вы говорите, дайте мне одну строки (в случайном порядке) для каждого пользователя, а затем заказать эти случайные строки секунд, так что даже если у вас есть заказ, это не влияет на группировку:

MySQL Docs состояние

сервера может свободно выбрать любое значение из каждой группы, так что, если они не совпадают, значение, выбранное неопределенно. Более того, выбор значений из каждой группы не может зависеть от добавления предложения ORDER BY.

Как таковые, если только ваши столбцы, исключенные из агрегата и группы, функционально зависят от столбца, включенного в группу (например, первичного ключа), затем используйте явную группировку. В вашем случае, чтобы получить все строки из таблицы вы можете использовать:

SELECT stat.ID, 
     stat.User, 
     stat.Seconds, 
     stat.Time 
FROM NamethatChampion_stats Stat 
     INNER JOIN 
     ( SELECT User, MIN(Seconds) AS Seconds 
      FROM NamethatChampion_stats 
      GROUP BY User 
     ) MaxStat 
      ON MaxStat.User = stat.User 
      AND MaxStat.Seconds = stat.Seconds 
ORDER BY Seconds ASC 
LIMIT 100 

Example on SQL Fiddle

Недостатком указанного способа является то, что если пользователь имеет 2 записи с одинаковым быстрым временем и будет возвращаться. Для удаления этих дубликатов потребуется дополнительная агрегация (вам, вероятно, необходимо будет ограничить первым или последним тестом с одинаковой оценкой).

Смежные вопросы