Справка по MySQL:ВЫБЕРИТЕ table2.id ГДЕ … table1.date является самой большой

StackOverflow https://stackoverflow.com/questions/765667

  •  12-09-2019
  •  | 
  •  

Вопрос

У меня есть 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 первых строк с датами

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top