2015-07-17 3 views
0

Так что у меня этот запрос:IN и NOT IN статьи не применяются

SELECT m.id, (
    SELECT GROUP_CONCAT(
    DISTINCT tag_id 
    ORDER BY tag_id 
    SEPARATOR '-' 
) FROM tagging 
    WHERE mng_id = m.id 
    ORDER BY tag_id DESC 
) as tags 
FROM product m 
    INNER JOIN tagging tg ON (m.id = tg.mng_id) 
WHERE 1 
    AND tg.tag_id IN (34,20) AND tg.tag_id NOT IN (42) 
    AND (nme LIKE 'tomo%' OR alt_nme LIKE 'tomo%') 
GROUP BY m.id 

Этот запрос должен возвращать записи с тегом # 34, 20 и не имеют тега # 42, название пластинки должен начинаться с ' Томо.

Но по какой-то причине он не удаляет продукт с тегом # 42 из результатов. Может ли кто-нибудь помочь определить проблему с этим запросом?

ответ

1

Если вы хотите записи с метками 34 и 20, но не 42, попробовать что-то вроде этого:

SELECT p.id 
FROM product p INNER JOIN 
    tagging tg 
    ON p.id = tg.mng_id 
GROUP BY p.id 
HAVING SUM(tg.tag_id = 34) > 0 AND 
     SUM(tg.tag_id = 20) > 0 AND 
     SUM(tg.tag_id = 42) = 0; 

Если вы хотите получившиеся теги, просто добавьте group_concat(tg.tag_id).

Это кажется более простым, чем ваш подход.

+0

Я создаю страницу поиска, и tag_id не фиксирован. Пользователю будет предложено ввести список tag_id, чтобы начать поиск, так что tag_id может быть 1 или больше. Кроме того, я хочу включить поиск имени – user3751852

+0

@ user3751852. , , Итак, создайте соответствующий запрос в приложении. Это всего лишь вопрос о том, чтобы скомпоновать предложение «иметь». –

+0

Да. Я просто понимаю, просто добавив replace = с IN, я думаю. – user3751852