2017-12-28 14 views
-2

ユーザーが配列の形式で格納されているテーブルを作成しました。例えば、1つのブログ記事に複数のユーザーがある私はuser_idの列またはuser_tagged_id列に存在するユーザIDを持つが、それはすべてのIDを引き上げているなどでユーザーを取得するには、クエリを使用しています正確なユーザーIDと一致するユーザーがテーブルに存在します

+ user_tagged_id + user_id + Status + 
| 1, 4, 7  | 6  | Posted | 
|  10, 6  | 1  | Posted | 
| 11, 4, 1 | 1  | Posted | 
| 1, 2  | 3  | Posted | 

をタグ付けそれだけですべてではない、その行をretunすべきuser_tagged_id列内のuser_id = 1が存在は、LIKE演算子をカンマ区切りリストで検索するには意味

SELECT * FROM forums WHERE (status = 'Posted' OR status = 'Reported') 
AND (user_id = '1' OR user_tagged_id IN ('1')) ORDER BY id DESC LIMIT 0, 5 
+8

カラム内のカンマ区切りの値...と私は外に出ています...正規化について読んでください。データベースは優れたシートではありません。 – fancyPants

+0

実際に私はポストでは1人以上のユーザーがタグ付けできるので、私はこのメソッドを使って複数のユーザーが投稿でタグ付けできるようにしているからです。 –

+0

"status " –

答えて

1

を行う場合に1と一致するが、私は正確な数が一致するように取得したいです発生する可能性のあるさまざまな条件に注意する必要があります。

例では、検索される文字列(針)はです。

  1. リストに含まれる要素は1つのみです。この要素は、針ではなく、針または針を含む文字列である可能性があります。425または142です。あなたが探している文字列だけを見つけるには、文字列が等しい場合はチェックしてください:user_tagged_id = '42'
  2. リストは針で始まりますが、より多くの要素が含まれている可能性があります。これは、針の後にカンマがあるが、針の前にはカンマがないことを意味する。 12342または425のように、ニードルだけが見つかって針で終わるか始まらない文字列でないことを確認するには、条件に続けてコンマを入れる必要がありますが、先行記号は含まれません:user_tagged_id LIKE CONCAT('42', ',%')
  3. リストに針が含まれている可能性があります。 12342または425-のように、針で始まりまたは終わる文字列が見つからないようにするには、前と次のコンマの両方をLIKE条件に追加する必要があります。user_tagged_id LIKE CONCAT('%, ', '42', ',%')
  4. リストは次のように終わることがあります針。文字列が針に終わるが発見されていないことを確認します - のように - 前のコンマはLIKE条件の一部である必要があります:user_tagged_id LIKE CONCAT('%, ', '42')

あなたはすべてを追加する必要があり、特定のIDのリストをフィルタリングするにはdisjunctionとしての4つの条件。

これは非常に読み込みが集中しているので、ユーザーのタグ付けを保持する新しいテーブルを作成し、クエリにJOINという名前を付けることをお勧めします。

関連する問題