2009-07-20 4 views
0

Ich habe eine 3 SQL-Tabellen:Die letzte Frage in der letzten Woche gefunden. (SQL-Abfrage)

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

Ich mag eine SQL-Abfrage schreiben, um die QuetionId und MemberID der Frage zu finden, welche die höchste Stimme in der letzten Woche hat. Ich habe diese Abfrage in PHP geschrieben, aber es gibt mir ein falsches Ergebnis:

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

Die $startofweek und $endofweek geben das Datum für den Beginn der letzten Woche und dem Ende der letzten Woche.

Kann mir bitte jemand dabei helfen.

Beste Zeeshan

+0

Sie erwähnen in einem Kommentar unten, dass Sie alle Fragen mit der höchsten Bewertung wünschen. Sie sollten das in Ihrer Frage erwähnen. – sangretu

Antwort

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

Ich habe Sie Code ... Immer noch gibt mir der Fehler: "PHP Warnung: mysql_fetch_array(): geliefert Argument ist keine gültige MySQL-Ergebnis-Ressource" –

+0

Versuchen Sie es in 'MySQL Query Browser' zu starten, um' PHP' zu trennen Probleme mit MySQL-Problemen. – Quassnoi

0

Hoffnung, die Sie mit Verbindungen irgendwo zu tun hat;)

Und Fragen ohne Antworten, was das betrifft.

Abgesehen davon ... sieht es so aus, als würden Sie das Mitglied der Frage zuordnen, was möglicherweise keinen Sinn ergibt, wenn Ihre Tabellen so eingerichtet sind, wie sie aussehen.

1

Nun, zuerst, MAX() ohne Gruppierung ist .. nutzlos, Sie brauchen es in diesem Fall nicht. Zweitens, wenn Sie möchten, dass Ihre Ergebnisse von der höchsten zur niedrigsten Bewertung gewählt werden, warum bestellen Sie nicht nach Vote1a und nehmen Sie einfach das erste Ergebnis mit einer LIMIT Klausel.

+0

Sie haben meine Frage nicht bekommen, ich brauche nur den einen Eintrag mit der höchsten Bewertung. oder wenn es mehr als eine Frage mit der gleichen höchsten Bewertung gibt ... all diese Fragen –

+0

Nun, mein Vorschlag gilt immer noch, aber es wird komplizierter mit der Anforderung, ALLE Zeilen mit der höchsten Bewertung zu erhalten.In diesem Fall können Sie einen einfachen Join mit einem WHERE-Schlüssel schreiben, der die Zeilen mit der höchsten Bewertung auswählt, die Sie in einer Unterabfrage erhalten, in den Zeilen SELECT Vote1a AS höchsteVote, * FROM qotwMember, qotwQuestion1a , qotwVote1a <...> WHERE qotwVote1a.Vote1a = (select max (Vote1a) aus qotwVote1a Gruppe von Vote1a) ich ommited habe das Teil, wegen der Längenbeschränkung verbinden - dies ist nur Pseudo-Code ist, ich bin nicht sicher, es funktioniert wie es ist :) –

0

Versuchen Sie folgendes:

SELECT Vote1a AS highestVote, * VON qotwMember, qotwQuestion1a, qotwVote1a WHERE qotwMember.MemberId = qotwQuestion1a.MemberId UND qotwQuestion1a.QuestionId = qotwVote1a.QuestionId UND qotwQuestion1a.MemberId = qotwVote1a. MemberID UND nachdatieren> = ' ". $ startofweek"' UND nachdatieren < = '“. $ endofweek. "‘ GROUP BY Votela, * MIT MAX (Votela) ORDER BY qotwQuestion1a.QuestionId DESC");

Nicht zu sicher auf die Syntax von diesem, aber die Grundidee ist, eine Abfrage zu haben, die alle Datensätze erhalten kann, und dann in der letzten Minute, es zu jenen Aufzeichnungen zu isolieren, die den MAX (Vitela) haben.

Ich würde auch empfehlen, * nicht zu verwenden, es sei denn, Sie benötigen es unbedingt. Ich weiß, dass es ein Problem sein kann, wenn Sie die meisten Spalten in den Tabellen haben möchten, aber es ist immer die beste Vorgehensweise, nur die Spalten auszuwählen, die Sie benötigen.

Verwandte Themen