MySQL Join Query错误,我做错了什么?

时间:2012-09-15 22:29:24

标签: mysql sql database join

我有3张桌子:

  • 用户
  • user_groups

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

  • 每个用户在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
  • 在其检查项目属于userId的位置,以及今天发布的项目以及发布的项目数量少于5个。

当我运行此查询时,出现此错误:

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

我做错了什么?

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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'和'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

您还可以使用&gt; 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
相关问题