MySQL-запрос, возвращающий неожиданные результаты - PullRequest
0 голосов
/ 15 марта 2012

У меня есть 2 таблицы, одна из которых содержит информацию о городе (в игре), а другая содержит оценки, записанные за периоды дня.Примеры таблиц были упрощены.

CREATE TABLE cities(
  cid INT(100),
  name VARCHAR(100),
  updatedAt DATETIME
);
CREATE TABLE cl_scores(
  cid INT(100),
  score INT(255),
  updatedAt DATETIME
);

Я пытаюсь собрать список баллов для конкретного города.Список должен содержать только MAX (updatedAt) дату и оценку за каждый день.Вот что у меня есть:

SELECT a.cid, b.name, a.score, a.updatedAt FROM ci_scores AS a 
JOIN cities AS b ON a.cid = b.cid 
JOIN (SELECT MAX(updatedAt) AS maxUpdatedAt FROM ci_scores 
GROUP BY DATE(updatedAt)) AS L ON DATE(L.maxUpdatedAt) = DATE(a.updatedAt) 
WHERE a.cid = 10158241 ORDER BY a.updatedAt ASC;

Однако, он не возвращает ни одной записи для каждого дня.Фактически он возвращает каждую строку в таблице ci_scores и просто добавляет поле имени, как показано ниже:

+----------+---------+-------+---------------------+
| cid      | name    | score | updatedAt           |
+----------+---------+-------+---------------------+
| 10158241 | Genesis |  3087 | 2012-03-13 04:04:03 |
| 10158241 | Genesis |  3207 | 2012-03-13 17:48:56 |
| 10158241 | Genesis |  3255 | 2012-03-14 00:44:11 |
| 10158241 | Genesis |  3262 | 2012-03-14 10:21:05 |
| 10158241 | Genesis |  3262 | 2012-03-14 13:42:42 |
+----------+---------+-------+---------------------+

Что я делаю неправильно в своем запросе ???

Решения решены

SELECT a.cid, b.name, a.score, a.updatedAt FROM ci_scores AS a 
JOIN cities AS b ON a.cid = b.cid 
JOIN (SELECT MAX(updatedAt) AS maxUpdatedAt FROM ci_scores 
GROUP BY DATE(updatedAt) LIMIT 1) AS L ON L.maxUpdatedAt = a.updatedAt
WHERE a.cid = 10158241 ORDER BY a.updatedAt ASC;

Это не сработало, удаление DATE () = DATE () возвращает 0 записей, так как времена разные.Если я добавлю это обратно, оно возвращает:

+----------+---------+-------+---------------------+
| cid      | name    | score | updatedAt           |
+----------+---------+-------+---------------------+
| 10158241 | Genesis |  3087 | 2012-03-13 04:04:03 |
| 10158241 | Genesis |  3207 | 2012-03-13 17:48:56 |
+----------+---------+-------+---------------------+

Это неверно, мне нужна 1 запись на каждый день, и эта запись является последней, введенной в этот день.

Ответы [ 3 ]

2 голосов
/ 15 марта 2012

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

SELECT a.cid, b.name, a.score, a.updatedAt FROM ci_scores AS a 
JOIN cities AS b ON a.cid = b.cid 
JOIN (SELECT MAX(updatedAt) AS maxUpdatedAt FROM ci_scores 
GROUP BY DATE(updatedAt)) AS L ON L.maxUpdatedAt = a.updatedAt
WHERE a.cid = 10158241 ORDER BY a.updatedAt ASC;

ОБНОВЛЕНИЕ: Есть другая ошибка, что в подзапросе вам нужно сгруппировать по идентификатору города какну, чтобы вы могли получить правильную максимальную дату:

SELECT a.cid, b.name, a.score, a.updatedAt FROM ci_scores AS a 
JOIN cities AS b ON a.cid = b.cid 
JOIN (SELECT MAX(updatedAt), cid AS maxUpdatedAt FROM ci_scores 
GROUP BY DATE(updatedAt), cid) AS L ON L.maxUpdatedAt = a.updatedAt AND L.cid = a.cid
WHERE a.cid = 10158241 ORDER BY a.updatedAt ASC;
1 голос
/ 15 марта 2012
SELECT a.cid, b.name, a.score, a.updatedAt FROM ci_scores AS a 
JOIN cities AS b ON a.cid = b.cid 
JOIN (SELECT MAX(updatedAt) AS maxUpdatedAt FROM ci_scores 
GROUP BY DATE(updatedAt) LIMIT 1) AS L ON L.maxUpdatedAt = a.updatedAt
WHERE a.cid = 10158241 ORDER BY a.updatedAt ASC;
0 голосов
/ 15 марта 2012

try

SELECT DISTINCT A.CID, C.NAME, A.updatedAt, A.SCORE FROM cl_scores A
INNER JOIN
(
SELECT D.CID, D.SD, MAX ( S.updatedAt ) MD FROM cl_scores S
INNER JOIN (SELECT DISTINCT S.CID, DATE ( S.updatedAt ) SD FROM cl_scores S WHERE S.CID = 10158241) D ON D.CID = S.CID AND D.SD = DATE ( S.updatedAt )
GROUP BY D.CID, D.SD
) B ON B.CID = A.CID AND B.MD = A.updatedAt
INNER JOIN cities C ON C.CID = A.CID

Вышеприведенное дает вам за CID = 10158241 в день (только дни, присутствующие в таблице!) Строку с max updatedAt и соответствующими score ...ВНИМАНИЕ: если у вас есть две строки с ТОЧНЫМ updatedAt (вплоть до второй ...), это может дать вам более одной строки ...

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