2

我有 3 张桌子:

  • 用户
  • 项目
  • 用户组

  • 每个用户可以将多个项目发布到项目表

  • 每个用户在 user_groups 中有一个记录,它定义了他所属的用户组(例如新用户、初级用户、高级用户管理员等)

我正在尝试获取满足以下条件的用户的 ID 列表:

  • 属于用户组“3”
  • 今天发布的项目少于 5 个

这是我的查询:

SELECT u.id, COUNT (i.id) as numPosted
FROM users u, items i
    JOIN user_groups on user_groups.userId = u.id
    AND user_groups.groupId = '5'
 WHERE                          
     i.userId = u.id AND
     i.datePosted = CURDATE() AND                         
     numPosted < 5
  • 在 JOIN 中,它确保用户属于用户组 5
  • 并在 Where 中检查项目属于 userId,以及今天发布的项目,发布的项目数量小于 5。

当我运行这个查询时,我得到这个错误:

#1630 - FUNCTION items.COUNT does not exist. Check the 
'Function Name Parsing and Resolution' section in the Reference Manual

我究竟做错了什么?

4

2 回答 2

4

删除之后的空格COUNT,设置groupId = '3'(假设 groupId 确实是文本),并添加一个HAVING子句:

SELECT u.id, COUNT(i.id) as numPosted
  FROM users u
       JOIN user_groups g ON (g.userId = u.id AND g.groupId = '3')
       LEFT OUTER JOIN items i ON (i.userId = u.id and i.datePosted = CURDATE())
  GROUP BY u.id
  HAVING COUNT(i.id) < 5

还有一个问题是捕获没有发帖的用户。直接加入,你会失去这些用户,那里需要一个外部加入。

于 2012-09-15T23:30:28.900 回答
2

首先,CURDATE() 返回当前日期,隐含时间为 00:00:00。因此,如果您说: CURDATE() == "2012-09-16 00:38:16" 它将返回 0,因为 CURDATE 是 "2012-09-16 00:00:00"。您应该使用 BETWEEN 语句:datePosted BEWEEN CURDATE() 和 NOW() (隐含表示 BETWEEN '2012-09-16 00:00:00' AND '2012-09-16 00:38:16')。

您可以尝试:

SELECT u.id, COUNT(i.id) as numPosted
FROM users u, items i
JOIN user_groups on user_groups.userId = u.id
AND user_groups.groupId = '3'
WHERE i.userId = u.id
AND i.datePosted BETWEEN CURDATE() AND NOW()
AND numPosted < 5

您也可以使用 > CURDATE(),这在正常情况下是完全相同的,因为如果今天(curdate)是 2012-09-16,那么它旁边的每个条目都将是今天(但使用前一个更安全查询,因为如果您使用外部服务来恢复/插入数据,它可能是将来的事情......)

SELECT u.id, COUNT(i.id) as numPosted
FROM users u, items i
JOIN user_groups on user_groups.userId = u.id
AND user_groups.groupId = '3'
WHERE i.userId = u.id
AND i.datePosted > CURDATE()
AND numPosted < 5
于 2012-09-15T22:40:57.203 回答