2009-07-25 3 views
4

У меня есть этот довольно сложный запрос, который захватывает данные из трех таблиц, и теперь я хочу, чтобы это было еще сложнее (о, уважаемый)!SQL-запрос для выбора всего за исключением максимального значения

Я бы хотел, чтобы последняя опубликованная функция отображалась в ее собственном разделе страницы, и это довольно просто, выбрав последнюю запись в таблице. Однако для сложного запроса (главной страницы сайта) я хотел бы иметь возможность НЕ показывать эту функцию.

Я хотел бы union следующий запрос к моему предыдущему запросу, но не возвращает правильные результаты:

SELECT 
    features.featureTitle AS title, 
    features.featureSummary AS body, 
    features.postedOn AS dummy, 
    DATE_FORMAT(features.postedOn, '%M %d, %Y') AS posted, 
    NULL, 
    NULL, 
    staff.staffName, 
    features.featureID 
FROM 
    features 
    LEFT JOIN staff ON 
     features.staffID = staff.staffID 
WHERE features.postedOn != MAX(features.postedOn) 
ORDER BY dummy DESC LIMIT 0,15 

Этот запрос возвращает следующее сообщение об ошибке:

MySQL error: #1111 - Invalid use of group function

Is там любой путь вокруг этого?

+0

Зачем использовать features.postedOn AS манекен (предполагая, что он называет его фиктивным, а не использует его) не просто ORDER BY features.postedOn? – Stefan

+0

features.postedOn никогда не получает * используется * в контексте сайта, это всегда отформатированная строка «отправлена». Это фиктивная строка для поддержания порядка различных записей, поэтому это имя «манекен» (так как упорядочение по «отправленным» будет возвращать бессмысленные результаты). – different

ответ

5

max запрос должен быть в своем собственном подзапроса, поэтому окончательный SQL должны быть ::

SELECT features.featureTitle AS title, 
    features.featureSummary AS body, 
    features.postedOn AS dummy, 
    DATE_FORMAT(features.postedOn, '%M %d, %Y') AS posted, 
    NULL, 
    NULL, 
    staff.staffName, 
    features.featureID 
FROM 
    features 
    LEFT JOIN staff ON 
     features.staffID = staff.staffID 
WHERE 
    features.postedOn != (select max(features.postedOn) from features) 
+1

Ты звезда. Спасибо. :-) – different

+0

Фильтрация на поле даты, вероятно, не очень хорошая идея, поскольку она не гарантируется быть уникальной - одновременно могут быть две должности. фильтрация по id лучше. – Guss

+0

Учитывая частоту моего размещения проводных статей (1 неделя или меньше), это будет не проблема. Спасибо, в любом случае. :-) – different

0

Проблема у вас есть то, что это то, что вам нужно найти максимум (последняя) функция от table, переходя по каждой строке, но MAX() - это групповая функция - вам нужно сгруппировать все строки, чтобы использовать ее.

вы можете использовать подзапрос, чтобы получить идентификатор последней функции:

WHERE featureId <> (SELECT featureId From features ORDER BY postedOn DESC LIMIT1) 

есть проблема с этим подходом - подвыборка выполняется для каждой строки, но это не так уж дорого.

Смежные вопросы