показать один результат на человека, отсортированного по дате - PullRequest
0 голосов
/ 12 июня 2018

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

SELECT * FROM resultateval join personne using (id) group by id

это запрос, который показывает один результат на людей, и вот таблица.

enter image description here

он должен показать

654321 / 08-06-2018 / 12 : 02 / 5 / 8 / 1
 A256589 / 05-06-2018 /13 : 05 / 7 / 10 / 2

Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

То, что вы делаете, очень неправильно.Вы группируете по id, но выбираете все столбцы.Поскольку id не является уникальным в ваших объединенных данных, это не имеет смысла и является недопустимым SQL.Вы не можете сказать: «Дайте мне dateeval (и т. Д.) Для id».Вы должны сказать что-то вроде: "" Дайте мне минимальное / максимальное / среднее dateeval для id ".

Этот запрос должен привести к ошибке, но MySQL снаружи *В режиме 1013 * мы проскальзываем и тихо преобразуем select * в select id, any_value(dateeval), any_value(heureeval) .... Таким образом, вы получаете произвольно выбранные значения, которые могут даже основываться на разных записях.

То, что вы хотите, выглядит примерно так:

select *
from resultateval 
join personne using (id)
where (id, timestamp(dateeval,heureeval)) in
(
  select id, max(timestamp(dateeval,heureeval)) 
  from resultateval 
  join personne using (id)
  group by id
);
0 голосов
/ 12 июня 2018

Поскольку вы сохранили время и дату отдельно, запрос, который вам нужно сделать, относительно уродлив.Мы можем сформировать эффективную метку времени, используя ADDTIME, чтобы добавить время heuereeval к дате dateeval.Тогда это просто базовый запрос объединения:

SELECT t1.*
FROM resultateval t1
INNER JOIN
(
    SELECT id, MAX(ADDTIME(dateeval, heureeval)) AS max_date
    FROM resultateval
    GROUP BY id
) t2
    ON t1.id = t2.id AND
       ADDTIME(t1.dateeval, t1.heureeval) = t2.max_date;

enter image description here

Демонстрация

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

Редактировать: Как я и опасался, на основании комментариев кажется, что вы сохранили свои даты в виде текста.Вы можете использовать следующий вызов функции для генерации даты на основе текста даты:

STR_TO_DATE(dateeval, '%d-%m-%Y')

Просто замените в моем исходном запросе dateeval на приведенный выше вызов STR_TO_DATE, и он все еще должен работать.

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