2009-07-20 9 views
0

I have a 3 sql tables:Trouver la plus haute question votée la semaine dernière. (Requêtes SQL)

qotwQuestion1a(QuestionId [primarykey], Question, MemberId, PostDate); 
qotwVote1a (QuestionId [primarykey], MemberId [primarykey], Vote1a); 
qotwMember (MemberId [primarykey], Name, Password, emailId); 

Je veux écrire une requête SQL pour trouver le QuetionId et MemberID de la question qui a le plus haut vote la semaine dernière. Je l'ai écrit cette requête en php, mais il me donne un mauvais résultat:

$result6 = mysql_query("SELECT MAX(Vote1a) AS highestVote, * FROM qotwMember, qotwQuestion1a , qotwVote1a 
        WHERE qotwMember.MemberId=qotwQuestion1a.MemberId 
        AND  qotwQuestion1a.QuestionId=qotwVote1a.QuestionId 
        AND  qotwQuestion1a.MemberId=qotwVote1a.MemberId 
        AND  PostDate>='".$startofweek."' AND PostDate<='".$endofweek."' 
        ORDER BY qotwQuestion1a.QuestionId DESC "); 
while($row6 = mysql_fetch_array($result6)) 
    { 
    echo "The highest voted question of the last week is: "; echo $row6['highestVote']; echo $row6['MemberId'] . " " . $row6['Name'] . " " . $row6['Password'] . " " . $row6['PostDate'] . " " . $row6['Question']." ".$row6['QuestionId']." ".$row6['Vote1a']; 
    echo "<br />"; 
    } 

Le $startofweek et $endofweek donnent la date du début de la semaine dernière et à la fin de la semaine dernière.

Quelqu'un peut-il m'aider avec ceci, s'il vous plaît.

Meilleur Zeeshan

+0

Vous mentionnez dans un commentaire ci-dessous que vous voulez toutes les questions avec le vote le plus élevé. Vous devriez mentionner cela dans votre question. – sangretu

Répondre

1
SELECT * 
FROM (
     SELECT q.QuestionId, q.MemberID 
     FROM qotwQuestion1a q 
     JOIN qotwVote1a v 
     ON  v.QuestionID = q.QuestionID 
     WHERE PostDate BETWEEN $startdate AND $enddate 
     GROUP BY 
       q.questionID 
     ORDER BY 
       COUNT(*) DESC 
     LIMIT 1 
     ) qo 
JOIN qotwMember m 
ON  m.MemberID = q.MemberID 
+0

Je vous ai utilisé le code ... Toujours me donne l'erreur: "PHP Attention: mysql_fetch_array(): l'argument fourni n'est pas une ressource de résultat MySQL valide" –

+0

Essayez de l'exécuter dans 'MySQL Query Browser', séparer' PHP' problèmes de problèmes MySQL. – Quassnoi

0

espère que vous avez affaire à des liens quelque part;)

et des questions sans réponses, pour cette question. À part ça ... il semble que vous faites correspondre le membre à la question, ce qui pourrait ne pas avoir de sens si vos tables sont configurées comme elles semblent l'être.

1

Eh bien, tout d'abord, en utilisant MAX() sans grou- pe est inutile, vous n'en avez pas besoin dans ce cas. Deuxièmement, si vous voulez que vos résultats commandés du plus haut voté au plus bas voté, pourquoi ne pas vous commandez par Vote1a et prenez juste le premier résultat avec une clause LIMIT.

+0

Vous n'avez pas eu ma question, j'ai besoin de la seule entrée avec le vote le plus élevé. ou s'il y a plus d'une question avec le même vote le plus élevé .. toutes ces questions –

+0

Eh bien ma suggestion s'applique toujours, mais il devient plus compliqué avec l'exigence d'obtenir TOUTES les lignes avec le plus haut vote.Dans ce cas, vous pouvez écrire un select simple avec un WHERE close, qui sélectionne les lignes avec le vote le plus élevé, que vous pouvez obtenir dans une sous-requête, quelque chose dans les lignes SELECT Vote1a AS HighestVote, * FROM qotwMember, qotwQuestion1a , qotwVote1a <...> OÙ qotwVote1a.Vote1a = (select max (Vote1a) du groupe qotwVote1a par Vote1a) J'ai ommited la jonction partie, en raison de la restriction de longueur - c'est juste pseudocode, je ne suis pas sûr qu'il fonctionne comme si :) –

0

Essayez ceci:

SELECT Vote1a AS highestVote, * DE qotwMember, qotwQuestion1a, qotwVote1a OÙ qotwMember.MemberId = qotwQuestion1a.MemberId ET qotwQuestion1a.QuestionId = qotwVote1a.QuestionId ET qotwQuestion1a.MemberId = qotwVote1a. MemberID ET POSTDATE> = ' ". $ startofweek"' ET POSTDATE < = ' ». $ endofweek. " » GROUP BY Votela, * AYANT MAX (Votela) ORDER BY qotwQuestion1a.QuestionId DESC");

Pas trop sûr sur la syntaxe de celui-ci mais l'idée de base est d'avoir une requête qui peut obtenir tous les enregistrements, et ensuite à la dernière minute, isoler seulement les enregistrements ayant le MAX (Votela).

Je recommande également de ne pas utiliser * sauf si vous en avez absolument besoin. Je sais que cela peut être pénible si vous voulez la plupart des colonnes dans les tableaux, mais il est toujours préférable de ne sélectionner que les colonnes dont vous avez besoin.

Questions connexes