Проблемы с упорядочением результатов запроса SQL, когда у меня есть связи - PullRequest
0 голосов
/ 20 июля 2009

Мои таблицы выглядят так:

qotwQuestion1a
    QuestionId [primarykey]
    Question
    MemberId
    PostDate

qotwVote1a
    QuestionId [primarykey]
    MemberId [primarykey]
    Vote1a

qotwMember
    MemberId [primarykey]
    Name
    Password
    emailId

В приведенном ниже запросе Sql суммируется количество голосов за каждый вопрос (который имеет postDate между датой startofweek и endofweek), а затем отображает его.

$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'];
        }
}

Этот запрос работает нормально, за исключением «ORDER BY total DESC». Запрос дает результат, но не упорядочивает результат по «итогу». Но моя проблема заключается в том, чтобы получить вопрос с максимальным количеством голосов. если есть связь между несколькими вопросниками, мне понадобятся все эти вопросы.

Может ли кто-нибудь помочь мне с этим

Лучший Zeeshan

Ответы [ 2 ]

3 голосов
/ 20 июля 2009

Ваш код структурирован таким образом, что вы будете получать только одну запись результата при каждом выполнении запроса. Предложение SQL ORDER BY не применяется к коду PHP, вызывающему его.

Вам необходимо реструктурировать это так, чтобы предложение ORDER BY действительно что-то делало.

Я бы заменил все это одним запросом:

$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'];
}

Предполагается, что вопрос и имя уникальны по идентификатору. Если нет, вы, вероятно, захотите разбить это на два запроса, используя идентификаторы вместо имен для поиска информации:

   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

Затем найдите имя участника и вопрос, основываясь на ID вопроса.

Или вы можете сделать действительно очень большой запрос:

 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 голосов
/ 20 июля 2009

Проблема в том, что второй запрос всегда возвращает одну строку. Вы должны объединить оба запроса, используя оператор GROUP, что-то вроде этого:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...