Mysql НЕ не работает в этом запросе с использованием GROUP BY — почему?

#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. Спасибо, но я не мастер — это стандартный материал!