Справка по MySQL:ВЫБЕРИТЕ table2.id ГДЕ … table1.date является самой большой
Вопрос
У меня есть 2 таблицы, для запроса которых используется внутреннее соединение.
SELECT COUNT(table2.id)
FROM table2
INNER JOIN table1 ON table2.relazioneid = table1.id
WHERE table1.date > ? AND table1.date < ?
Он подсчитывает идентификаторы записей в отчетах между двумя датами.Таблица 1 содержит информацию об отчетах (дата, идентификатор группы и т. д.), таблица 2 содержит записи в отчетах.
Я хотел бы сделать запрос почти таким же, за исключением того, что он выбирает только идентификаторы из отчета с самой последней датой между этими двумя датами.
Кто-нибудь может помочь?Я не могу разобраться с запросами типа MAX(date) - все, что я получаю, - это количество каждого идентификатора, а также максимальную дату, а не только те идентификаторы из максимальной даты.
Спасибо,
Я подумал, возможно, о вложенном SQL-запросе. Можете ли вы это сделать?Я могу найти ссылки в Google, но не могу заставить его работать...Что-то подобное:
SELECT COUNT(table2.id)
FROM table2
INNER JOIN table1 ON table2.relazioneid = table1.id
WHERE table1.date > ? AND table1.date < ? AND
(
SELECT MAX(date)
FROM table1
WHERE date > ? AND date < ?
)
Однако не могу заставить это работать, и когда я пытаюсь протестировать это в phpMyAdmin, он выкидывает меня с ошибкой, сообщающей, что у моего пользователя нет привилегий SELECT.Странно, поскольку это тестовый сервер, я зашел под root.
Решение
Без дополнительной информации о структуре таблиц я бы предложил вам попробовать что-то вроде этого:
SELECT t2.id
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.relation_id
WHERE t1.date BETWEEN ? AND ?
HAVING MAX(t1.date)
Я не проверял это, но это должно указывать на одно направление, в котором вы могли бы решить эту проблему.Другое ваше предложение использовать подзапрос допустимо и может работать примерно так:
SELECT *
FROM table2 t2
WHERE t2.parent_id IN (
SELECT t1.relation_id
FROM table1 t1
WHERE t1.date BETWEEN ? AND ?
GROUP BY t1.relation_id
HAVING MAX(t1.date)
)
Или при присоединении к временной таблице:
SELECT *
FROM table2 t2
INNER JOIN (
SELECT t1.relation_id
FROM table1 t1
WHERE t1.date BETWEEN ? AND ?
GROUP BY t1.relation_id
HAVING MAX(t1.date)
) AS t1 ON t2.relation_id = t1.relation_id
Другие советы
...WHERE table1.date BETWEEN'2009-01-01' AND '2009-01-02' ORDER BY table1.date LIMIT 10
вы получите 10 первых строк с датами