Подтвердить что ты не робот

Похожий и не нравится в одном запросе mysql

Я хочу сделать запрос, содержащий "like" и "not like".

Текущий пример: я хочу, чтобы все начиналось с "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'.

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

4b9b3361

Ответ 1

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

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

Ответ 2

Вы можете использовать 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 будет тонко фильтровать результаты.

Ответ 3

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

Но если вы не можете этого сделать, вы должны использовать запятые как разделители и 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

Ответ 4

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

SELECT * FROM links

INNER JOIN (SELECT * FROM links WHERE category NOT LIKE '1 | 6 | 199 |%') AS escl1 ON (links.category = escl1.category)

INNER JOIN (SELECT * FROM links WHERE category NOT LIKE '1 | 6 | 200 |%') AS escl2 ON (links.category = escl2.category)

WHERE category LIKE '1 |%'

ЗАКАЗАТЬ score ОПИСАНИЕ DESC 9