2010-12-17 81 views
0

我正在開發自由職業者站點,並且在此站點中,用戶(項目所有者和專家)可以爲每個站點留下反饋。我試圖找到等待離開的反饋數量。複雜的SQL查詢問題

該查詢返回項目的這些在過去30天內沒有反饋,用戶ID = 3,並有適當的狀態代碼watting反饋計數:

SELECT COUNT(*) 
FROM projects 
WHERE projects.status IN (5, 10) AND projects.status_created >= DATE_SUB('2010-12-17 21:24:51', INTERVAL 30 DAY)  
AND NOT EXISTS(
    SELECT * FROM 
    feedbacks WHERE feedbacks WHERE projects.id = feedbacks.project_id AND feedbacks.from_id = '3' 
) 

此查詢的作品時,我們只有2個在數據庫中的用戶否則,例如,如果我們改變用戶ID 3到99(用戶具有與項目沒有關係),查詢仍返回1計數,但應該返回0

我的數據庫方案:

PROJECTS(id, project_owner_id, project_title, ...) 
FEEDBACKS(id, project_id, to_id, from_id, ....) 
PROJECT_BIDS(id, project_id, bid_owner_id, accepted, ...) We can use this table for find out which user's bid is accepted then accepted bid owner have right for leave feedback. 

我們可以使用project_bids.accepted字段來找出哪些用戶與項目有關係。如果被接受爲真,那麼項目的自由職業者專家就是這個用戶。另外projects.project_owner_id是確定關係的另一列。

我該如何解決我的問題?謝謝。

+2

也許一個自由職業者可以幫忙嗎? – 2010-12-17 20:44:36

+1

如果您爲每個表格提供了樣本數據,那麼您對錶格之間關係的解釋將更加清晰,以顯示哪些內容無效。 – Gerrat 2010-12-17 21:05:59

回答

1

您的查詢(書面)正在尋找因爲在過去30天內創建的項目數量已經附加了評論/反饋,並且該人員對該項目進行了評論。

突出的第一件事是您正在檢查投影的創建日期,而不是評論/反饋的日期。如果你這樣做,當項目變得超過30天時,在運行查詢時不會再有反饋。您很可能會希望將時間戳添加到反饋表,並檢查該字段。

此外,您正在計算項目數量,而不是滿足條件的反饋數量。

對於你的查詢,我會嘗試這樣的:

SELECT COUNT(feedbacks.id) 
FROM feedbacks, projects 
WHERE 
    projects.id = feedbacks.project_id AND 
    projects.status IN (5, 10) AND 
    feedbacks.timestamp >= DATE_SUB('2010-12-17 21:24:51', INTERVAL 30 DAY) 
ORDER BY projects.id 

這會發現每個每個項目反饋次數(給定狀態)。如果你想只計算由誰中標人分別給予了反饋,你可以添加到WHERE子句:

AND feedbacks.from in ( 
    SELECT project_bids.bid_owner_id 
    FROM project_bids 
    WHERE 
     project_bids.accepted = 1 AND 
     project_bids.project_id = projects.id 
) 

你的英語有點難以理解,所以請澄清我誤解的東西。

給其他人的提示:我仍然試圖習慣Mark Down系統。隨意糾正我上面的格式。

+0

這個答案引導我寫出正確的查詢。謝謝 – mTuran 2010-12-18 22:24:24

1
NOT EXISTS(SELECT FROM ...feedbacks.from_id = '99') 

始終是真實的:99(用戶具有與項目沒有關係),

這就是爲什麼你«仍然回報1»

+0

您忘記了第一個(有效)條件:_SELECT * FROM feedbacks WHERE projects.id = feedbacks.project_id AND feedbacks。from_id ='3'_如果該行與正確的項目不匹配,則說明它不會匹配用戶。 – BryanH 2010-12-17 22:41:10

+0

第一個條件不相關 – renegm 2010-12-17 23:18:16

+0

用下面的語句測試你的查詢:NOT EXISTS(SELECT * FROM feedbacks WHERE 1 = 2) – renegm 2010-12-17 23:20:17