нравится и не нравится в одном запросе mysql

Я хочу сделать запрос, содержащий «нравится» и «не нравится».

Текущий пример: я хочу, чтобы все начиналось с «1|%», но не с «1|6|199|%» или «1|6|200|%».

Текущий запрос:

'SELECT * FROM `links` WHERE `category` LIKE '1|%' NOT LIKE '1|6|199|%','1|6|200|%' ORDER BY `score` DESC LIMIT 9'.

Но это не работает. Какие-нибудь советы? спасибо


person Maurice Kroon    schedule 15.06.2009    source источник
comment
Не работает, должно быть немного точнее. Я предполагаю, что вы получили синтаксическую ошибку - и в этом случае у Майкла Харена есть ваше решение.   -  person Daniel Schneller    schedule 15.06.2009


Ответы (4)


Просто добавьте "и категорию"...

SELECT * FROM links 
WHERE category LIKE '1|%' 
  AND category NOT LIKE '1|6|199|%','1|6|200|%' 
ORDER BY score DESC LIMIT 9

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

SELECT * FROM links 
WHERE category LIKE '1|%' 
  AND category NOT LIKE '1|6|199|%'
  AND category NOT LIKE '1|6|200|%' 
ORDER BY score DESC LIMIT 9
person Michael Haren    schedule 15.06.2009
comment
спасибо! это сработало! Однако что не так со следующим? SELECT * FROM links WHERE category LIKE '1|6|%' AND category NOT LIKE '1|6|137|%','1|6|151|%','1|6|118|%','1 |6|176|%','1|6|67|%','1|6|199|%','1|6|160|%' ORDER BY score DESC LIMIT 9 ? он показывает пусто, но это не так! - person Maurice Kroon; 15.06.2009
comment
если вы хотите выполнить несколько исключений, я предлагаю вам использовать SUBSTR(category, 1, 8) NOT IN ( 1|6|137|','1|6|151|', ... ). - person instanceof me; 15.06.2009

Вы можете использовать regexps:

SELECT  *
FROM    links 
WHERE   category LIKE '1|%' 
        AND category NOT REGEXP '^1\\|6\\|(199|200)\\|'
ORDER BY
        score DESC
LIMIT 9

Обратите внимание, что REGEXP не использует индексы, а LIKE использует.

В этом запросе LIKE '1|%' будет служить грубым фильтром, используя индекс category, если он есть, а REGEXP будет выполнять точную фильтрацию результатов.

person Quassnoi    schedule 15.06.2009

Я думаю, что большая проблема заключается в том, что у вас денормализованные таблицы. Правильным ответом было бы нормализовать ваши таблицы.

Но если вы не можете этого сделать, вы должны использовать запятые в качестве разделителей и вместо них FIND_IN_SET():

WHERE FIND_IN_SET('1', category) > 1
  AND FIND_IN_SET('6', category) > 1
  AND FIND_IN_SET('199', category) = 0
  AND FIND_IN_SET('200', category) = 0
person longneck    schedule 15.06.2009

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

ВЫБЕРИТЕ * ИЗ ссылок

ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ * ИЗ ссылок, ГДЕ категория НЕ НРАВИТСЯ '1|6|199|%') AS escl1 ON (links.category=escl1.category)

ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ * ИЗ ссылок, ГДЕ категория НЕ НРАВИТСЯ '1|6|200|%') AS escl2 ON (links.category=escl2.category)

ГДЕ категория LIKE '1|%'

ЗАКАЗАТЬ ПО score DESC LIMIT 9

person Ash    schedule 29.01.2014