0

我有两个表:用户和组

在我的“用户”表中,所有用户 ID 都有一个名为“ID”的列。

在我的表“组”中有一个名为“参与者”的列,该列中的字段填充了所有用户 ID,例如“PID_134,PID_489,PID_4784” - 并且有一列“ID”标识特定组.

现在我想要做的是,我想创建一个菜单来显示所有尚未在此特定组中的用户。

所以我需要获取所有用户 ID,这些用户 ID 尚未在具有特定 ID 的组的“参与者”列中。

如果有一个单独的 mysql 查询会很酷 - 但是任何 PHP + MySQL 解决方案也可以。

这是如何运作的?有什么猜测吗?

更新:
我知道,这不是代码,但是有没有办法我可以做这样的事情来返回所有用户的列表?

SELECT * 
FROM users, groups 
WHERE groups.participants NOT LIKE '%PID_'users.id'%' AND groups.id = 1;
4

3 回答 3

0

您可以从多个表中进行选择,如下所示:

SELECT * from users, groups WHERE users.id != groups.participants AND groups.id = 1;

这将列出所有不在组 id 1 中的用户;使用连接可以找到更优雅的解决方案,但这很简单并且可以解决问题。

于 2012-04-19T14:56:32.310 回答
0

我相信这样的事情应该会有所帮助:

SELECT * FROM users WHERE users.id NOT IN (SELECT groups.participants FROM groups)

但这仅在您的数据库已标准化时才有效。因此,对于您的情况,我只看到 PHP + MySQL 解决方案。不是很优雅,但它可以完成工作。

<?php
$participants_array = mysql_query("SELECT participants FROM groups");
$ids = array();
while ($participant = mysql_fetch_assoc($participants_array))
{
  $id = explode(',', $participant['participant']);
  foreach ($id as $instance)
  {
    if (!in_array($instance, $ids)) $ids[] = $instance;
  }
}
$participants = implode(',', $ids);
$result = mysql_query("SELECT * FROM users WHERE id NOT IN ( $participants )");

但我强烈建议规范化数据库。

于 2012-04-19T15:37:34.287 回答
0

像这样的东西。您只需摆脱 ID 的“PID_”部分。

SELECT * FROM [users] WHERE [id] NOT IN 
(SELECT replace(id,'PID_','') FROM groups WHERE group_name='group1')

Group1 将是您的变量 - 您打开的菜单的组 ID/名称。

于 2012-04-19T16:08:11.530 回答