2010-12-17 11 views
0

私はフリーランサーサイトを開発しており、このサイトではユーザー(プロジェクトの所有者と専門家)がそれぞれのフィードバックを残すことができます。私は帰るのを待つフィードバックの数を見つけることを試みている。我々は、データベース内の唯一の2のユーザーを持っているとき複雑なSQLクエリ質問

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' 
) 

このクエリは、作品である:

このクエリは、最後の30日には、フィードバック、ユーザID = 3を持っていないと、適切なステータスコードを持っているプロジェクトのwattingフィードバック数を返します。それ以外の場合は例えば、我々は99に(プロジェクトとは関係を持たないユーザ)のユーザID 3を変更した場合、クエリはまだカウントに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

多分フリーランサーが助けることができますか? –

+1

テーブル間の関係についてのあなたの説明は、各テーブルのサンプルデータを提供して、何が動作していないかを示すならば、より明確になります。 – Gerrat

答えて

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 
) 

あなたの英語を理解することは少し難しいので、私は何かを誤解明確にしてください。

他の人への注意:私はまだマークダウンシステムに慣れようとしています。上記の私の書式を自由に修正してください。

+0

これは正しいクエリを書くために私に案内された答えです。ありがとう – mTuran

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

+0

最初の条件は無関係です – renegm

+0

次のようにクエリをテストしてください:NOT EXISTS(SELECT * FROMフィードバックWHERE 1 = 2) – renegm