У меня есть запрос, который я пытаюсь реализовать, но что-то не совсем верно.
Вот основы таблиц (я пропустил ненужные вещи, а также индексы и внешний ключ):
CREATE TABLE IF NOT EXISTS `PROJECT` (
`ID` INT NOT NULL AUTO_INCREMENT ,
`USER_ID` INT NULL ,
`NAME` VARCHAR(40) NOT NULL ,
`PROJECT_NUMBER` VARCHAR(30) NULL ,
`CREATION_DATE` DATETIME NULL
CREATE TABLE IF NOT EXISTS `MODEL` (
`ID` INT NOT NULL AUTO_INCREMENT ,
`PROJECT_ID` INT NOT NULL ,
CREATE TABLE IF NOT EXISTS `SIMULATION_SET` (
`ID` INT NOT NULL AUTO_INCREMENT ,
`MODEL_ID` INT NULL ,
`CREATION_DATE` DATETIME NULL ,
`START_TIME` DATETIME NULL ,
`END_TIME` DATETIME NULL
Я пытаюсь сделать следующее: я хочу получить проекты, которые имеют самые последние наборы симуляций для конкретного пользователя.Это пример запроса:
SELECT P.ID, P.USER_ID, P.NAME, P.PROJECT_NUMBER, S.ID SET_ID, S.START_TIME
FROM PROJECT P
INNER JOIN MODEL M ON M.PROJECT_ID=P.ID
INNER JOIN SIMULATION_SET S ON S.MODEL_ID=M.ID
WHERE P.USER_ID=5 AND S.START_TIME IS NOT NULL
GROUP BY P.ID
ORDER BY S.START_TIME DESC LIMIT 5
Я перепробовал несколько вариантов, и проблема в том, что группа, по-видимому, фильтрует его так, что я получаю первый имитационный набор в таблице для каждого проектатогда как то, что я хочу отсортировать, является последним.Без GROUP BY я получаю список всех наборов симуляции для пользователя, упорядоченных правильно.То, что я хочу, это проекты в таком порядке, но я не понимаю.
На выборочном наборе без группировки по я получаю это, которое упорядочено правильно:
+----+---------+-----------------+----------------+--------+---------------------+
| id | user_id | name | project_number | SET_ID | start_time |
+----+---------+-----------------+----------------+--------+---------------------+
| 14 | 5 | Krusty Krab | 123 | 267 | 2011-07-07 14:57:15 |
| 16 | 5 | Pineapple | p456 | 266 | 2011-07-07 12:48:58 |
| 21 | 5 | Patrick's House | US | 265 | 2011-07-07 12:48:18 |
| 14 | 5 | Krusty Krab | 123 | 264 | 2011-07-07 12:47:42 |
| 13 | 5 | Bikini Bottom | B123 | 263 | 2011-07-07 12:44:07 |
| 16 | 5 | Pineapple | p456 | 262 | 2011-07-07 12:42:52 |
| 14 | 5 | Krusty Krab | 123 | 261 | 2011-07-07 12:41:52 |
| 16 | 5 | Pineapple | p456 | 260 | 2011-07-07 12:40:21 |
+----+---------+-----------------+----------------+--------+---------------------+
С предложением GROUP BY я получаю это:
+----+---------+-----------------+----------------+--------+---------------------+
| id | user_id | name | project_number | SET_ID | start_time |
+----+---------+-----------------+----------------+--------+---------------------+
| 21 | 5 | Patrick's House | US | 265 | 2011-07-07 12:48:18 |
| 13 | 5 | Bikini Bottom | B123 | 263 | 2011-07-07 12:44:07 |
| 14 | 5 | Krusty Krab | 123 | 261 | 2011-07-07 12:41:52 |
| 16 | 5 | Pineapple | p456 | 260 | 2011-07-07 12:40:21 |
+----+---------+-----------------+----------------+--------+---------------------+
Порядок неправильный, и он тянет start_time с самого раннего, а я хочу, чтобы он был заказан с самого последнего.Первым проектом в списке должен быть Krusty Krab.Я думал, что мне может понадобиться сделать подзапросы, чтобы сделать это, но я не уверен, как.Я знаю, что мастера SQL найдут это очевидным, или, по крайней мере, я на это надеюсь!Заранее спасибо за любую помощь в этом.