2009-07-20 8 views
0

Mes tableaux ressemblent à ceci:Problèmes de commande les résultats d'une requête SQL quand j'ai des liens

qotwQuestion1a 
    QuestionId [primarykey] 
    Question 
    MemberId 
    PostDate 

qotwVote1a 
    QuestionId [primarykey] 
    MemberId [primarykey] 
    Vote1a 

qotwMember 
    MemberId [primarykey] 
    Name 
    Password 
    emailId 

La requête Sql ci-dessous sommes le nombre de voix pour chaque QuestionID (qui a une POSTDATE entre la date startofweek et endofweek) et l'affiche ensuite.

$result2 = mysql_query(" SELECT * FROM qotwMember, qotwQuestion1a 
        WHERE qotwMember.MemberId=qotwQuestion1a.MemberId 
        AND  PostDate>='".$startofweek."' AND PostDate<='".$endofweek."' 
        ORDER BY qotwQuestion1a.QuestionId DESC "); 
while($row2 = mysql_fetch_array($result2)) 
{ //echo("testing"); 
    $result3= mysql_query ("SELECT SUM(Vote1a) AS total FROM qotwVote1a 
          WHERE QuestionId='".$row2['QuestionId']."' 
          ORDER BY total DESC "); 
     while($row3 = mysql_fetch_array($result3)) 
     { 
      echo $row2['Question'] . " " .$row2['Name'] . " " .$row3['total']; 
     } 
} 

Cette requête fonctionne correctement, à l'exception de "ORDER BY total DESC". La requête donne le résultat, mais n'ordonne pas le résultat par "total". Mais mon problème est d'obtenir le questionId qui a le nombre maximum de votes. S'il y a un lien entre quelques questions, j'aurais besoin de toutes ces questions.

Quelqu'un peut-il me aider

Meilleur Zeeshan

Répondre

3

Votre code est structuré de telle sorte que vous n'obtenir un résutlats retour chaque fois que la requête est exécutée. La clause SQL ORDER BY ne s'applique pas au code PHP qui l'appelle.

Vous devrez restructurer ceci afin que la clause ORDER BY soit en train de faire quelque chose.

Je remplacerait le tout avec une seule requête:

$result3= mysql_query (" 
    SELECT qotwQuestion1a.Question, qotwMember.Name, SUM(qotwVote1a.Vote1a) AS total 
    FROM qotwMember 
    INNER JOIN qotwQuestion1a 
    ON qotwMember.MemberId = qotwQuestion1a.MemberId 
    INNER JOIN qotwVote1a 
    ON qotwVote1a.QuestionId = qotwQuestion1a.QuestionId 
    WHERE PostDate>='".$startofweek."' 
    AND PostDate<='".$endofweek."' 
    GROUP BY qotwQuestion1a.Question, qotwMember.Name 
    ORDER BY total DESC 
"); 
while($row3 = mysql_fetch_array($result3)) { 
    echo $row3['Question'] . " " .$row3['Name'] . " " .$row3['total']; 
} 

Cela suppose que la question et le nom sont uniques par ID. Sinon, vous aurez probablement envie de briser ce en deux requêtes, en utilisant plutôt les ID des noms pour rechercher des informations:

SELECT qotwQuestion1a.QuestionId, SUM(qotwVote1a.Vote1a) AS total 
    FROM qotwQuestion1a 
    INNER JOIN qotwVote1a 
    ON qotwVote1a.QuestionId = qotwQuestion1a.QuestionId 
    WHERE PostDate>='".$startofweek."' 
    AND PostDate<='".$endofweek."' 
    GROUP BY qotwQuestion1a.QuestionId 
    ORDER BY total DESC 

ensuite de regarder le nom de membre et question sur la base QuestionID.

Ou vous pourriez faire vraiment, vraiment BigQuery:

SELECT qotwQuestion1a.Question, qotwMember.Name, SubQuery.total 
FROM (
    SELECT qotwQuestion1a.QuestionId, SUM(qotwVote1a.Vote1a) AS total 
    FROM qotwQuestion1a 
    INNER JOIN qotwVote1a 
    ON qotwVote1a.QuestionId = qotwQuestion1a.QuestionId 
    WHERE PostDate>='".$startofweek."' 
    AND PostDate<='".$endofweek."' 
    GROUP BY qotwQuestion1a.QuestionId 
) SubQuery 
INNER JOIN qotwQuestion1a 
    ON SubQuery.QuestionId = qotwQuestion1a.QuestionId 
INNER JOIN qotwMember 
    ON qotwMember.MemberId = qotwQuestion1a.MemberId 
ORDER BY total DESC 
+0

Merci beaucoup Welbog. Votre solution a parfaitement fonctionné. pourriez-vous également me dire comment devrais-je obtenir la question qui a été votée au maximum. Je veux dire, je peux le commander par le total maintenant, et la question avec un maximum de votes sera sur le dessus, mais s'il y a des liens. comment vais-je obtenir ces questions alors ?? –

+0

S'il y a des liens, vous les obtiendrez tous en haut, comme des dossiers séparés. – Welbog

+0

Oui, j'ai compris. Mais comment puis-je afficher tous ceux qui sont les questions max, et aucun de l'autre .. en utilisant alors ?? –

0

Le problème est que la deuxième requête retourne toujours seule ligne. Vous devez combiner les deux requêtes à l'aide de l'instruction GROUP, quelque chose comme ceci:

SELECT qotwQuestion1a.QuestionId, SUM(Vote1a) AS total 
FROM qotwMember, qotwQuestion1a, Vote1a 
WHERE qotwMember.MemberId=qotwQuestion1a.MemberId 
    AND qotwQuestion1a.QuestionId=Vote1a.QuestionId 
    AND PostDate>='".$startofweek."' AND PostDate<='".$endofweek."' 
GROUP BY qotwQuestion1a.QuestionId 
ORDER BY total desc; 
Questions connexes