web-dev-qa-db-ja.com

1つのmysqlクエリのように、好きではない

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

現在の例:すべてが「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

18
Maurice Kroon

「とカテゴリ」を追加するだけ...

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
30
Michael Haren

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は結果を細かくフィルターします。

3
Quassnoi

より大きな問題は、正規化されていないテーブルがあることです。正解は、テーブルを正規化することです。

ただし、それができない場合は、区切り文字としてカンマを使用し、代わりに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
longneck

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

0
Ash