Php 多对多关系、运算符和不正确结果的可能性

Php 多对多关系、运算符和不正确结果的可能性,php,postgresql,optimization,many-to-many,Php,Postgresql,Optimization,Many To Many,我在创建最佳SQL查询时遇到问题。我有一个私人消息系统,用户可以向许多用户或用户组发送单个消息。收件人存储在单个文本列中(不要问我为什么我不负责设计该列),如下所示: [60,63,103,68] SELECT u.name, u.last_name, g.group_name FROM user u LEFT JOIN group g ON u.id = g.u

我在创建最佳SQL查询时遇到问题。我有一个私人消息系统,用户可以向许多用户或用户组发送单个消息。收件人存储在单个文本列中(不要问我为什么我不负责设计该列),如下所示:

[60,63,103,68]
SELECT u.name, u.last_name, g.group_name

                    FROM 
                        user u
                    LEFT JOIN
group g ON u.id = g.user_id
                    WHERE
                        u.id IN (".$users.") and
g.id IN (".$groups.")
此外,我还添加了新的文本列,其中放置了用户所属的组,以便在数据库中作为组:

[55,11,11,0]
现在我想获取所有用户(接收者)及其组。我有一个表,其中列出了用户和组id之间的关系。问题是单个用户可以属于多个组,例如,用户60可以位于组id 55和11中。我希望以最理想的方式进行操作(列中可以存储50多个接收器…),因此我可以这样编写查询:

[60,63,103,68]
SELECT u.name, u.last_name, g.group_name

                    FROM 
                        user u
                    LEFT JOIN
group g ON u.id = g.user_id
                    WHERE
                        u.id IN (".$users.") and
g.id IN (".$groups.")
不幸的是,查询返回的组名可能与我放置在何处的组ID不正确连接。我可以创建PHP foreach并使用我拥有的ID获取用户及其组:

foreach($user as $key => $single)
{
$sql = "...
      where u.id = $single AND g.id = $group[$key] ";
}

但我认为这是非常糟糕的方式。是否有任何方法可以在单个查询中获取用户和指定组?

由于用户和组仅通过其在列表中的顺序位置链接,因此您需要利用该方法

快速和肮脏的方法将是并行:

SELECT u.name, u.last_name, g.group_name
FROM  (   
   SELECT unnest(string_to_array('3,1,2', ',')::int[])    AS usr_id  -- users
        , unnest(string_to_array('10,11,12', ',')::int[]) AS grp_id  -- groups
  ) sel
JOIN   usr_grp ug USING (usr_id, grp_id)
JOIN   usr u USING (usr_id)
JOIN   grp g USING (grp_id);
注意我是如何将像
用户
这样的标识符替换的

这样,数组中具有相同序号位置的元素(从逗号分隔的列表转换而来)形成一行。两个数组都需要相同数量的元素,否则操作将产生笛卡尔积。根据你的描述,这里应该是这样。添加代码以验证是否可能违反该条件

清洁替代品 虽然上述功能工作可靠,但它是SRF(设置返回函数)的一个非标准Postgres功能,一些人对此表示反对

有更干净的方法可以做到这一点。即将发布的9.4版Postgres将推出一项新功能:
具有有序性
,允许编写更干净的代码。这个相关的答案说明了这两个方面:

是否可以更改数据库?你能把两张桌子的柱子都贴在这里吗?所以我们有一个更好的视图?是的,但我想我会在这方面做很多工作…它是:用户、组、消息和用户到组的关系表。我将很快提供专栏。@Dieter您能澄清一下更改db的意思吗?你的意思是桌子的结构还是从博士后那里搬走?难以置信。看起来它与我正在使用的PGSQL 9.1兼容。