2016-06-17 11 views
2

列から特定の番号を見つける必要があります。の列にcityの番号9を探します。 「列cityMYSQL - 一致/文字列内の数字を検索

9 
49 
5,9 
4,94 
5,8,89,32 

のような数字の文字列を持っていると私はREGEXを使用して、私が試してみました

9 
5,9 

になりたいが、できるでしょうこれらのこれだけの結果に9番を見つける必要がありますそれを正しいものにする。誰かが私を正しい方向に向けることができますか?ここでは、これまで

SELECT 
    a.title, a.tourprice, a.city, b.city AS destCity 
FROM 
    tours a 
     RIGHT JOIN 
    (SELECT 
     id, city 
    FROM 
     destinations 
    WHERE 
     id = 47) b ON a.city LIKE CONCAT('%,', b.city) OR a.city LIKE CONCAT(b.city, ',%') //b.city evaluates to 9 

私はいつもか前か、私がしたい番号の後にコンマがあってもなくてもよい実現するクエリです。

+1

なぜ、「WHERE a.city LIKE」9、% 'OR a.city LIKE'%、9、% 'またはa.city LIKE'%、9''を使用しないのですか?さもなければ、あなたは 'どこREGISP '[[:<:]]9[[:>:]]' 'を使うかもしれないと思います。 *私はREGEXを使用してtryedですが、それを正しく得ることはできません。* - どの正規表現を試しましたか? –

+0

[適切にテーブルを正規化する](https://en.wikipedia.org/wiki/Database_normalization)について考えるべきです。 – Phylogenesis

答えて

1

MySQLの組み込み関数FIND_IN_SETがあります。これはあなたが望むことを実行します。

2番目の引数の最初の引数の1から始まるインデックスを返します.2番目の引数はカンマ区切りの文字列です。最初の引数が2番目の引数に存在しない場合は、0を返します。

SELECT FIND_IN_SET(9, '9');   -- 1 
SELECT FIND_IN_SET(9, '49');   -- 0 
SELECT FIND_IN_SET(9, '5,9');   -- 2 
SELECT FIND_IN_SET(9, '4,94');  -- 0 
SELECT FIND_IN_SET(9, '5,8,89,32'); -- 0 
SELECT FIND_IN_SET(9, '5,8,89,9,32'); -- 4 

MySQLはTRUEとしてFALSEとして0を扱い、任意の非0番号ので、あなたはWHERE句にしたり、JOINでそれを使用することができます。

RIGHT JOIN ... ON FIND_IN_SET(b.city, a.city) 

しかし、これは悪い考えであるように、カンマ区切りのリストを格納する理由several reasonsがあります。ツアーと都市の組み合わせごとに1つの行がある別のテーブルが必要です。

+0

マットありがとうございました。私はあなたが行った余分な長さのために正しい答えとしてあなたのものをマーキングしています。私はあまりにも単純だったので、この質問のopのように、私はできるだけ多くのテーブルを正規化しようとします。 – VeeK

2

これを試してみてください。

SELECT 
    a.title, 
    a.tourprice, 
    a.city, 
    b.city AS destCity 
FROM tours a 
RIGHT JOIN (
    SELECT id, city 
    FROM `destinations` 
    WHERE id = 47 
) b ON FIND_IN_SET('9', a.city) > 0 

)とa.cityはすべてカンマ,で区切られていない場合は、私はREGEXPが@WiktorStribiżewが与えられた答えのように、より賢明になると思います。

+1

@WiktorStribiżewそれを削除しupvote。 – Blank

2

私はあなたがLIKEと1つの可能なシナリオを逃したと思う:9は、エントリの途中に表示されている場合。あなたが正規表現で行くにしたいのであれば、

OR a.city LIKE CONCAT('%,', b.city, ',%') 

を追加し、[[:<:]]が有力であると[[:>:]]は、末尾の単語の境界である

WHERE a.city REGEXP CONCAT('[[:<:]]', b.city, '[[:>:]]') 

を試してみてください。しかし、このような単純な状況では、REGEXPを使用せずに、LIKEを使用することができます。これは、MySQLのREGEXPがかなりリソースを消費しているためです。