MySQL Как отфильтровать запрос на основе избежания определенного результата - PullRequest
0 голосов
/ 25 октября 2018

Вот упрощенный эквивалент:

Таблица: user_log

Поля: log_id, user_id, log_comment, log_created, log_updated

Что я пробовал:

    SELECT * FROM user_log 
    WHERE user_id = 123 
    AND log_comment = "The one I want"
    AND NOT log_comment = "The one I don't want"

Желаемый результат: в идеале я хотел бы, чтобы он возвращал все записи из таблицы для этого идентификатора пользователя, и ни одной вообще, если бы он содержал комментарий «Тот, который мне не нужен».

Фактический результат: не работает.Вместо этого он возвращает запись с комментарием «Тот, который я хочу».

Извините, если это не ясно из названия, я не знал, как описать мою проблему.

Ответы [ 5 ]

0 голосов
/ 26 октября 2018
SELECT * FROM user_log 
WHERE user_id = 123 
AND log_comment     LIKE "%The one I want%"
AND log_comment NOT LIKE "%The one I don't want%"

Когда я читаю ваше описание, вот несколько примеров log_comment

"Эй, тот, который я хочу - да!"- захватить этот
«Эй, тот, который я хочу - да, тот, который я хочу» - захватить этот
«Эй, тот, который я не хочу - да!»- пропустить это
«Эй, тот, который я хочу. О, подожди минуту, тот, который я не хочу» - пропустить этот
«Тот, который я не хочу О, подождите -Тот, который я хочу "- также пропущен

Если это не правильные результаты, то проясните свой вопрос с помощью набора примеров.

0 голосов
/ 25 октября 2018

Я бы использовал exists и not exists:

select ul.*
from user_log ul
where exists (select 1
              from user_log ul2
              where ul2.user_id = ul.user_id and
                    ul2.comment = 'The one I want'
             ) and
      not exists (select 1
                  from user_log ul2
                  where ul2.user_id = ul.user_id and
                        ul2.comment = 'The one I don''t want'
                 ) ;
0 голосов
/ 25 октября 2018

Я бы использовал NOT EXISTS:

SELECT ul.*
FROM user_log ul
WHERE NOT EXISTS (SELECT 1 
                  FROM user_log ul1 
                  WHERE ul.user_id = ul1.user_id AND ul1.log_comment = "The one I don't want"
                 );
0 голосов
/ 25 октября 2018

Я не уверен, что понимаю вопрос, но сработает ли это:

SELECT * FROM user_log 
WHERE user_id = 123 
AND log_comment not like "%The one I don't want%"
0 голосов
/ 25 октября 2018
  • Вы можете использовать фильтрацию на основе функции условного агрегирования, используя предложения Group By и Having.В производной таблице мы можем определить, есть ли в user_id = 123 какая-либо строка с log_comment = "The one I don't want".
  • HAVING NOT SUM(log_comment = "The one I don't want") гарантирует, что такой строки не существует для user_id.
  • Теперь просто присоединитесь к этомуПроизводный набор результатов таблицы устанавливается в таблицу user_log и получает только те строки, в которых log_comment = "The one I want".
  • Если есть даже одна строка с «Я не хочу» для user_id;этот запрос не будет возвращать ни одной строки.

Использовать условное агрегирование с Group By:

SELECT u1.* 
FROM user_log AS u1 
JOIN (SELECT u2.user_id 
      FROM user_log AS u2 
      WHERE u2.user_id = 123 
      GROUP BY u2.user_id 
      HAVING NOT SUM(u2.log_comment = "The one I don't want")
     ) AS dt ON dt.user_id = u1.user_id 
WHERE 
  u1.log_comment = "The one I want"
...