#php #mysql #sql
#php #mysql #sql
Вопрос:
Странная формулировка « Not
не работает!» Я знаю, но, как ни странно, результаты возвращаются там, где user_id
они существуют, хотя запрос направлен NOT (user_id = 1)
.
SELECT post_id, last_update
FROM the_table
WHERE last_update
BETWEEN NOW( ) - INTERVAL 7 DAY
AND NOW( ) AND NOT (user_id =1)
GROUP BY post_id
ORDER BY last_update DESC
Проще говоря, мы пытаемся получить последние результаты, за которые пользователь не проголосовал, но результаты появляются там, где пользователь действительно проголосовал, несмотря на NOT (user_id = 1)
.
Как это возможно? Является ли одна часть запроса преобладающей над другой? Возможно, группировка?
Как ни странно, все работает так, как предсказано на Localhost, но не на сервере! Как будто в sql-континууме есть разрыв, и реальность меняется в зависимости от среды. (И да, идентификатор пользователя равен 1 как на сервере, так и на локальном хосте)
Комментарии:
1. Вы пробовали изменить его на AND (user_id != 1)
2. Попробуйте
AND user_id != 1
. Не могли бы вы опубликовать некоторые данные своей базы данных?3. Почему
NOT(user_id=1)
это так? Кажется странным способом сделать это…4. Тот факт, что он работает на localhost, является случайностью. Результаты такого рода запросов (в частности, злоупотребление предложением GROUP BY) по своей сути непредсказуемы .
5. «злоупотребление» предложением group by??? Как этим злоупотребляют, разве это не функция, как и любая другая для такого рода целей? Тем не менее, спасибо, потому что кажется, что это непредсказуемо. Спасибо за подтверждение.
Ответ №1:
SELECT x.*
FROM the_table x
JOIN
( SELECT post_id
, user_id
, MAX(last_update) max_last_update
FROM the_table
WHERE last_update BETWEEN NOW( ) - INTERVAL 7 DAY AND NOW( )
AND user_id <> 1
GROUP
BY post_id
, user_id
) y
ON y.post_id = x.post_id
AND y.user_id = x.user_id
AND y.max_last_update = x.last_update
ORDER
BY x.last_update DESC;
Комментарии:
1. Ваш мастер SQL. Это работает. Мое использование «group by» по какой-то причине убивало его. Это работает.
2. Спасибо, но я не мастер — это стандартный материал!