「好き」と「嫌い」を含むクエリを実行したい。
現在の例: 「1|6|199|%」または「1|6|200|%」ではなく、「1|%」で始まるすべてが必要です。
現在のクエリ:
'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
より大きな問題は、テーブルが非正規化されていることだと思います。正しい答えは、テーブルを正規化することです。
ただし、それができない場合は、コンマを区切り記号として使用し、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
使用できます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
2 つの内部結合を使用することもできます。おそらく、このクエリの最適なソリューションではありませんが、それでも役立つ可能性があります。
SELECT * FROM リンク
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 カテゴリ LIKE '1|%'
説明制限による注文
score
9