2017-06-09 8 views
0

私は自分のSQLクエリでissuを持っています。 MySQLの各idには、1つまたは複数のタグがあります。 たとえば、id 1のタグの列には「110,2,3」があります。 id 2は "3,1100"です。 etc ... タグstringの各数字はグループです。 特定のグループからユーザーを選択する必要があります。SQL - 文字列のSELECT WHERE LIKE word1、word2など

だから私は、SQLで演算子のように使用してみました:

$query = $db->prepare(
    "SELECT * FROM USERS WHERE taglist LIKE :id_groups OR :id_groups2 OR :id_groups3" 
    ); 

$query->execute([ 
    "id_groups"=> $id_groups.",%", 
    "id_groups3"=> "%,".$id_groups, 
    "id_groups2"=> "%,".$id_groups.",%" 
    ]); 

しかし、私が望むように動作していません。たとえば、$ id_groupsを "3"に置き換えた場合は、上の例を使用します。それは、id 1がそのタグに "3"を持っていても、id 2ではなくid 1を選択するだけです。

最後に、文字列に数字が1つしかない場合はどうすればいいですか? "id_groups4" => $ id_groupsのORを追加すると、すべてのユーザーがこのグループに属していなくても返されます。

+4

テーブルを再設計することはできますか?これが最高の答えですから。あなたのタグは、おそらくこのようなデータを解析する必要がないように、自分のテーブルに1対Nの関係でなければなりません。 –

答えて

1

あなたはすべてのORを持つフィールドを渡す必要があります。これは、すべてのタグはカンマによって先行または続くことを期待して、このユースケースは、単一のタグをカバーしていない、あなたが本当に必要

$query = $db->prepare("SELECT * FROM USERS WHERE taglist LIKE :id_groups OR taglist LIKE :id_groups2 OR taglist LIKE :id_groups3"); 

$query->execute([ 
    "id_groups"=> $id_groups.",%", 
    "id_groups3"=> "%,".$id_groups, 
    "id_groups2"=> "%,".$id_groups.",%" 
    ]); 

注:

$query = $db->prepare("SELECT * FROM USERS WHERE taglist = :id_groups OR taglist LIKE :id_groups1 OR taglist LIKE :id_groups2 OR taglist LIKE :id_groups3"); 

$query->execute([ 
    "id_groups"=> $id_groups, 
    "id_groups1"=> $id_groups.",%", 
    "id_groups3"=> "%,".$id_groups, 
    "id_groups2"=> "%,".$id_groups.",%" 
    ]); 
+0

ありがとう、それは仕事です。 – Jilu

関連する問題