문제

나는 '좋아요'와 '좋아하지 않는'쿼리를하고 싶습니다.

현재 예 : 나는 '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'.

그러나 그것은 작동하지 않습니다. 팁이 있습니까? 고마워

도움이 되었습니까?

해결책

"그리고 카테고리"를 추가하십시오 ...

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

다른 팁

당신이 사용할 수있는 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결과를 잘 필터링합니다.

더 큰 문제는 당신이 정규화 된 테이블을 가지고 있다는 것입니다. 정답은 테이블을 정규화하는 것입니다.

그러나 그렇게 할 수 없다면 쉼표를 분리기로 사용하고 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

이 쿼리에 가장 적합한 솔루션은 아니지만 여전히 유용 할 수 있습니다.

* 링크에서 *를 선택하십시오

내부 조인 (범주가 '1 | 6 | 199 |%'가 아닌 링크에서 *) escl1 on (links.category = escl1.category)

내부 조인 ( '1 | 6 | 200 |%'가없는 링크에서 *) escl2 on (links.category = escl2.category)

'1 |%'와 같은 범주

주문 score DESC 제한 9

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top