21

「好き」と「嫌い」を含むクエリを実行したい。

現在の例: 「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'.

しかし、それはうまくいきません。任意のヒント?どうも

4

4 に答える 4

35

「およびカテゴリ」を追加するだけです...

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
于 2009-06-15T13:00:44.960 に答える
2

より大きな問題は、テーブルが非正規化されていることだと思います。正しい答えは、テーブルを正規化することです。

ただし、それができない場合は、コンマを区切り記号として使用し、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
于 2009-06-15T15:42:58.563 に答える
2

使用できます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|%'を使用して粗いフィルタとして機能し、は結果を細かくフィルタします。categoryREGEXP

于 2009-06-15T13:05:10.470 に答える
0

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|%'

説明制限による注文score9

于 2014-01-29T10:43:32.903 に答える