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 的查询和添加 AND 到 WHERE 对于 mysql 来说都会有点资源密集型,但如果其他解决方案不可行,那么这会做

谢谢,

帕维尔·K

4

1 回答 1

2

收到了 Thinking Sphinx 的开发者 Pat Allan 的回复,

链接文本


我认为最好的方法是如果消息不受限制,则构建一个包含 0 的字符串,否则返回组 ID,
用逗号连接在一起......即:“2,3,4,5,6”或“0”

因此,您需要为属性构建一个 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 回答