Нахождение вопроса с самым высоким рейтингом за последнюю неделю. (SQL-запрос) - PullRequest
0 голосов
/ 20 июля 2009

У меня есть 3 таблицы sql:

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

Я хочу написать sql-запрос, чтобы найти QuetionId и MemberId вопроса, который набрал наибольшее количество голосов за последнюю неделю. Я написал этот запрос в php, но он дает мне неправильный результат:

$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 />";
  }

$startofweek и $endofweek дают дату начала последней недели и конца последней недели.

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

Лучший Zeeshan

Ответы [ 4 ]

1 голос
/ 20 июля 2009

Ну, во-первых, использование MAX() без группирования ... бесполезно, в этом случае оно вам не нужно. Во-вторых, если вы хотите, чтобы ваши результаты упорядочивались с наивысшего на голосование до наименьшего, почему бы вам не сделать заказ по Vote1a и просто взять первый результат с предложением LIMIT.

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

Попробуйте это:

ВЫБРАТЬ Голосование1a КАК наибольшее количество голосов, * ОТ qotwMember, qotwQuestion1a, qotwVote1a ГДЕ qotwMember.MemberId = qotwQuestion1a.MemberId AND qotwQuestion1a.QuestionId = qotwVote1a.QuestionId AND qotwQuestion1a.MemberId = qotwVote1a.MemberId AND PostDate> = '". $ Startofweek."' И PostDate <= '". $ Endofweek."' GROUP BY Votela, * ИМЕЯ МАКС ORDER BY qotwQuestion1a.QuestionId DESC "); </p>

Не слишком уверен в синтаксисе этого, но основная идея состоит в том, чтобы иметь запрос, который может получить все записи, а затем в последнюю минуту изолировать его только от тех записей, которые имеют MAX (Votela).

Я бы также рекомендовал не использовать *, если вам это абсолютно не нужно. Я знаю, что это может быть неприятно, если вам нужно большинство столбцов в таблицах, но всегда лучше выбирать только те столбцы, которые вам нужны.

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

Надеюсь, вы где-нибудь имеете дело со связями;)

И вопросы без ответов, в этом отношении.

Кроме этого ... похоже, что вы сопоставляете участника с вопросом, что может не иметь смысла, если ваши таблицы настроены так, как они выглядят.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...