문제
나는 '좋아요'와 '좋아하지 않는'쿼리를하고 싶습니다.
현재 예 : 나는 '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
제휴하지 않습니다 StackOverflow