-1

我正在尝试构建一个自动完成输入来建议用户页面。

我有一个名为“用户”的表,其中包含字段

'id', '全名', '用户名', '图片',

带有字段的表“ project_admin ”

'id','project_id','user_id4

和一个带有字段的表' project_member ':

'id','project_id','user_id'。

我想获取特定 project_id 的所有既不是管理员也不是成员的用户,并且他们的全名或用户名中有 $term

我使用以下查询:

SELECT users.fullname,users.id,users.picture
FROM users, project_member, project_admin
WHERE (users.fullname LIKE '$term%'
OR users.username LIKE '$term%')
AND users.id NOT IN (SELECT user_id FROM project_member WHERE project_id=$project_id)
AND users.id NOT IN (SELECT user_id FROM project_admin WHERE project_id=$project_id) 
LIMIT 0,10

不幸的是,我得到的结果是第一个结果的重复次数是无限的。我应该怎么办?

解决了 是的,谢谢大家。真的 users.id,users.picture 是问题,删除后一切顺利

4

3 回答 3

4

您的原始查询存在一些问题,导致它返回的结果集很大。

首先,您实际上并没有在任何特定列上加入users,project_member和表。project_admin结果,您在它们之间创建了笛卡尔积。因此,如果users有 500 和project_member7800 并且project_admin有 6545 行,那么您从 25,525,500,000 行开始。我不认为这是您查询的意图。

其次,您没有在最终结果中使用project_memberand project_admin,因此您实际上不需要加入它们。您应该能够使用:

select u.fullname, u.id, u.picture
from users u
where (u.fullname LIKE '$term%' or u.username LIKE '$term%')
and u.id NOT IN (SELECT user_id 
                 FROM project_member 
                 WHERE project_id=$project_id)
and u.id NOT IN (SELECT user_id 
                 FROM project_admin 
                 WHERE project_id=$project_id)
LIMIT 0,10

如果您想从project_memberproject_admin表返回数据,请考虑使用 aLEFT JOIN而不是CROSS JOIN您当前使用的连接表。

于 2013-06-10T10:26:33.070 回答
2

我认为,您的问题是因为您不必要地加入了您不需要的三个表。您只需要从 users 表中获取数据并根据项目 id 排除在其他人中找到的用户名上的任何匹配项。

这是我会使用的:

SELECT 
  users.id, users.fullname, users.picture
FROM 
  users
WHERE 
  (users.fullname LIKE '$term%' OR users.username LIKE '$term%') 
AND 
  NOT EXISTS (
    SELECT 1 FROM project_member AS a WHERE a.project_id = '$project_id' AND a.user_id = users.id
  )
AND
  NOT EXISTS (
    SELECT 1 FROM project_admin AS b WHERE b.project_id = '$project_id'  AND b.user_id = users.id
  )
LIMIT 0, 10
于 2013-06-10T10:25:39.660 回答
0

您也可以将其表述为left outer join, 而不是使用not in:

SELECT users.fullname,users.id,users.picture
FROM users left outer join
     project_member
     on project_member.user_id = users.id left outer join
     project_admin
     on project_admin.user_id = users.id
WHERE (users.fullname LIKE '$term%' OR users.username LIKE '$term%') and
      project_member.user_id is NULL and
      project_admin.user_id is NULL
LIMIT 0,10

您根本不应该,from子句中使用。如果您想要笛卡尔积,请明确使用cross join.

于 2013-06-10T10:39:16.110 回答