「いいね」と「嫌い」を含むクエリを実行したい。
現在の例:すべてが「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'.
しかし、それはうまくいきません。任意のヒント? THX
「とカテゴリ」を追加するだけ...
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
2つの内部結合を使用することも可能ですが、このクエリにはおそらく最善の解決策ではありませんが、それでも有用な場合があります。
SELECT * FROMリンク
INNER JOIN(SELECT * FROMリンクWHEREカテゴリーNOT LIKE '1 | 6 | 199 |%')AS escl1 ON(links.category = escl1.category)
INNER JOIN(SELECT * FROMリンクWHEREカテゴリーNOT LIKE '1 | 6 | 200 |%')AS escl2 ON(links.category = escl2.category)
WHEREカテゴリーLIKE '1 |%'
ORDER BY
score
DESC LIMIT 9