1

私が開発している製品には、メッセージモデルがあります。

メッセージは、グループに制限することも、制限しない (全員が利用可能) こともできます。

ユーザーがメッセージのグループのいずれかに属している場合、またはメッセージが制限されていない場合、ユーザーはメッセージを見ることができます。

ここに表示されるメッセージを選択するクエリがあります(私が何を意味するかを明確にすることができることを願っています)

(2,3,4,5,6,1) はユーザーが属するグループで、ユーザーごとに異なります

SELECT `messages`.* FROM `messages`

LEFT JOIN groups_messages ON
messages.id=groups_messages.message_id AND groups_messages.group_id in (2,3,4,5,6,1)

 WHERE (messages.restricted=0 OR groups_messages.group_id is not NULL)

GROUP BY messages.id

ここにサブクエリを使用した類推クエリがあります。必要なものを明確にするのに役立つことを願っています

SELECT * FROM `messages` WHERE 
(
 restricted=0 OR id in ( select distinct message_id from groups_messages where group_id in  (2,3,4,5,6,1) )
 )

この可視性設定を思考スフィンクスの結果に適用することは何とか可能ですか? この OR と IN を適用する意味

Message.search "test" with/with_all

?

それが不可能な場合は、別の質問になります。検索で見つかったすべてのオブジェクトの ID を取得することは何とか可能ですか?

AND を WHERE 条件に追加するだけで、自分でクエリを実行できるようになります

SELECT * FROM `messages` WHERE
(
 restricted=0 OR id in ( select distinct message_id from groups_messages where group_id in (2,3,4,5,6,1) )
)
AND id in (ids_of_the_messages_found_by_thinking_sphinx)

LEFT JOIN を使用しないクエリと WHERE に AND を追加するクエリの両方が、mysql のリソースを少し消費すると思いますが、他の解決策が不可能な場合は、これで十分です。

ありがとう、

パベル・K

4

1 に答える 1

2

Thinking Sphinx の開発者である Pat Allan から回答を受け取りました。

リンクテキスト


最善の方法は、メッセージが制限されていない場合は 0 を含む文字列を作成することだと思います。それ以外の場合は、
コンマで連結されたグループ ID を返します。

したがって、属性の SQL スニペットを構築する必要があります。
漠然と次のようなものです。

has "IF(messages.restricted = 0, '0', GROUP_CONCAT (groups_messages.group_id SEPARATOR ','))", :as => :group_ids, :type => :multi

そして、検索のために:

Message.search "foo", :with => {
 :group_ids => [0] + current_user.message_group_ids
}

ただし、PostgreSQL を使用している場合、SQL スニペットは異なる必要があります...その場合はお知らせください。

それを試します

于 2009-10-22T12:50:13.527 に答える