Похожий и не нравится в одном запросе 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'.
Но это не работает. Какие-нибудь советы? ТНХ
Ответы
Ответ 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