Сравните оценки в двух таблицах и покажите те, где самые последние отличаются - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть две таблицы в MariaDB, где мне нужно показать те таблицы в левой таблице, где их текущий результат не совпадает с самым последним в таблице истории.

Например:

users

id name    current_score
1  Bob     4
2  Tom     5
3  Fred    3
4  Tim     3
5  Ian     4


histories
id user_id score date 
1  1       3     2018-11-13
2  1       4     2018-11-12
3  1       2     2018-11-11
4  2       5     2018-11-12

Выше я хотел бы показать Боба, поскольку его последняя история не совпадает с его текущим счетом, но не показать Тома, поскольку его матч

Я пытался использовать что-то вроде:

SELECT u.id, u.name, u.current_score 
FROM users u 
where u.current_score not in 
(select h.score from histories h where 
h.user_id=u.id order by h.date desc limit 1)

Это выдало ошибку:

#1235 - This version of MariaDB doesn't yet support 
'LIMIT & IN/ALL/ANY/SOME subquery' 

Если я уберу ограничение 1, то он возвращает почти все строки в пользователях - в каждой таблице есть несколько тысяч строк, но я думаю, что он должен вернуть около 50, но он возвращает более 4 100 строк из 4 285 возможных строк

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

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

SELECT
    u.id,
    u.name,
    u.current_score,
    h.score AS latest_score_from_history
FROM
    user AS u
LEFT JOIN
    -- This subquery gets the date of the latest history register for every user
    (SELECT
         user_id,
         MAX(date) AS maxDate
     FROM
         histories
     GROUP BY
         user_id) AS latest ON latest.user_id = u.id
LEFT JOIN
    histories AS h ON h.user_id = latest.user_id AND h.date = latest.maxDate
WHERE
    u.current_score <> h.score
0 голосов
/ 14 ноября 2018
  • Определите последний счет истории в коррелированном подзапросе внутри самого предложения Select.
  • Group By для пользователя и используйте предложение HAVING, чтобы рассмотреть случаи, когда текущий счет делаетне соответствует последней оценке в истории
  • Я должен использовать MAX() функцию агрегирования значений оценки, чтобы она была действительным ANSI SQL-совместимым GROUP BY.Это ни на что не влияет, так как соответствующие значения баллов равны только одному (таким образом, максимальному).

Вместо этого попробуйте следующее:

SELECT u.id, 
       u.name, 
       MAX(u.current_score) AS m_current_score, 
       MAX((select h.score 
           from histories h 
           where h.user_id = u.id 
           order by h.date desc limit 1)) AS history_score 
FROM users u 
GROUP BY u.id, u.name 
HAVING m_current_score <> history_score
...