2009-04-30 26 views
0

私はfavs(その投稿をお気に入りとしてマークしたユーザーのID)をfavs列のコンマ区切りのリストとして使用することに決めました。この列は、送信者、URL、コンテンツなど。Mysql:カンマで区切られた値の取得

しかし、私はのようなクエリを使用して、これらの行をカウントしようとすると:もちろん

select count(id) 
from messages 
where favs like '%userid%' 

すべてのidのは、別の

例えばの一部とすることができるので、それは間違った結果を返しますid = 1のクエリを実行すると、他のconteのカウンタも増加しますユーザーID 11で好きなNT ...

このシステムを動作させるためにあなたのアイデアや解決策を教えていただけますか?

答えて

5

数やさんで、あなたは醜いソリューション持つことができます。そこよりエレガントな解決策がありそうだが、その1は、少なくとも、あなたが探している結果を返します

select count(id) from messages where favs like 'userid,%' or favs like '%,userid,%' or favs like '%,userid' 

を、私は信じています。

1

値を取得し、PHPで分解して配列を数えなければならない場合があります。

MySQLでこれを行う方法はありますが、私が見たことから、彼らは面倒です。

3

ユーザーとお気に入りのメッセージの関連付けが別のテーブルに格納されるように、データモデルを変更することはできますか?

アソシエーションを単一の列に格納すると、リレーショナルデータベースの利点が無効になります。同様の機能を使用してパフォーマンスコストを支払うと、関係に関する追加データを保存することができず、データをクエリするのが難しくなります。

代替モデルは、(私は新しいユーザですので、画像を含めることはできませんが、私は1つhere製)は、このような何かを探しているかもしれません。代わりにそれと

users 
- id 

messages 
- id 

favorite_messages 
- user_id (foreign key to users.id) 
- message_id (foreign key to messages.id) 

、元のクエリが希望を以下のように簡略化すること:

select count(1) from favorite_messages where user_id = userid 

また、ユーザーの好みのメッセージのリストを取得するようなことを行うことができます。

select 
    * 
from 
    messages 
    inner join favorite_messages 
     on messages.id = favorite_messages.message_id 
where 
    user_id = userid 
2

これを使用する必要があります。

SELECT count(id) FROM messages WHERE FIND_IN_SET('userid',favs) > 0 
関連する問題