2010-12-17 7 views
0

Je développe un site de pigiste et dans ce site les utilisateurs (les propriétaires de projet et les experts) peuvent laisser des commentaires pour chacun. J'essaie de trouver le nombre de feedbacks en attente de partir.Requête SQL compliquée Question

Cette requête renvoie le nombre de commentaires de Watting de projet qui ont pas de commentaires dans les 30 derniers jours, ID utilisateur = 3 et avoir le code d'état approprié:

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

Cette requête est fonctionne quand nous avons seulement 2 utilisateurs dans la base de données autrement, par exemple si nous changeons l'ID utilisateur de 3 à 99 (utilisateur qui n'a pas de relation avec le projet), requête retourne toujours 1 pour le nombre, mais il devrait être de retour de 0.

Mon schéma de base de données:

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. 

Nous pouvons utiliser le champ project_bids.accepted pour savoir quels utilisateurs ont une relation avec le projet. Si accepté vrai, l'expert indépendant du projet est cet utilisateur. Projects.project_owner_id est également une autre colonne pour déterminer la relation.

Comment puis-je résoudre ma requête? Je vous remercie.

+2

Peut-être qu'un pigiste pourrait vous aider? –

+1

Votre explication des relations entre les tables serait plus claire si vous fournissiez des exemples de données pour chaque table, pour montrer ce qui ne fonctionne pas. – Gerrat

Répondre

1

Votre requête (comme écrit) est à la recherche pour le nombre de projets qui ont été créés au cours des 30 derniers jours ont joint des commentaires/commentaires, et la personne en question a commenté sur ce projet.

La première chose qui ressort est que vous vérifiez la date à laquelle le projet a été créé, et non la date des commentaires/commentaires. Si vous faites cela, lorsque le projet aura plus de 30 jours, plus aucune rétroaction ne comptera lors de l'exécution de la requête. Vous voudrez probablement ajouter un horodatage à la table des commentaires et vérifier ce champ à la place.

En outre, vous effectuez le décompte du nombre de projets plutôt que le nombre de commentaires répondant aux critères.

Pour vous requête, je voudrais essayer quelque chose comme:

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 

Cela trouverez le nombre de rétroactions par chaque projet (de l'état donné). Si vous voulez compter que les évaluations qui ont été donnés par la personne qui a remporté l'enchère, vous pouvez ajouter à la clause 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 
) 

Votre anglais est un peu difficile à comprendre, alors s'il vous plaît préciser que je mal compris quelque chose.

Note à tous: J'essaie toujours de m'habituer au système Mark Down. N'hésitez pas à corriger ma mise en forme ci-dessus.

+0

Ceci est une réponse guidée pour que j'écrive une requête correcte. Merci – mTuran

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

est toujours vrai: 99 (utilisateur qui n'a pas de relation avec le projet),

C'est pourquoi vous «encore retour 1»

+0

Vous oubliez la première condition (valide): _SELECT * FROM feedbacks O projects projects.id = feedbacks.project_id ET feedbacks.from_id = '3'_ Si la ligne ne correspond pas au bon projet, alors il va de soi qu'elle ne correspondra pas à l'utilisateur. – BryanH

+0

La première condition est sans importance – renegm

+0

Testez votre requête avec: NOT EXISTS (SELECT * FROM feedbacks WHERE 1 = 2) – renegm