2012-09-15 83 views
2

我有3個表:MySQL加入查詢錯誤,我做錯了什麼?

  • 用戶
  • 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
  • 而在那裏它檢查的項目屬於用戶ID,而今天的發佈的項目,並公佈項目的數量少於5

當我運行此查詢,我得到這個錯誤:

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

我在做什麼錯?

+1

'groupId ='3''而不是5?不需要'GROUP BY u.id'嗎?還想知道'COUNT'之後的空間是否有所作爲? – Glenn

+0

檢查空間。顯然它會導致問題。看到這個:http://stackoverflow.com/questions/7840253/sql-count-not-working – Glenn

+0

@Glenn血腥地獄!是的,這是伯爵之後的空間!但是,現在它給出了錯誤:'#1054 - 'where子句'中的未知列'numPosted'。有關於此的任何想法? –

回答

4

後刪除空間COUNT,設置groupId = '3'(假設groupId確實是文本)和ad丁一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 

還有誰做沒有職位捕捉用戶的問題。直接加入,你將失去這些用戶,那裏將需要一個外部聯接。

+0

我需要在第一條語句中將COUNT(i.id)保留爲numPosted嗎? HAVING已經足夠檢查它了 –

+0

我得到'#1054 - 'on'子句'中的未知列'u.id'用這個查詢 –

+0

不,你可以把',COUNT(i.id) SELECT部分​​中的numPosted。我不知道「用戶」表中的列是什麼。有沒有'users.id'? – Glenn

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 

您還可以使用> 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 
+0

'datePosted'列是日期,而不是日期時間,所以這不是問題。日期將被匹配。問題是我得到了COUNT()的錯誤() –