2016-07-20 19 views
1

Ich habe ein kleines Problem mit einer Unterabfrage in SQL. sie die Abfragemysql Unterabfrage mit Feld aus Abfrage auswählen

SELECT st.title, count(q.id) as question_count, max(a.id) as maxid, 
      sum(case when a.answer is not null then 1 else 0 end) as answer_count, g.user_id as game_user_id, 
      a.game_id as a_game_id, a.modified as finished, (select modified as finished from answers a where a.id = g.maxid limit 1) as subquery 
     FROM games g 
     left join answers a on(a.game_id = g.id) 
     left join questions q on(a.question_id = q.id) 
     left join sessions s on(s.id = q.session_id) 
     left join sessiontypes st on(st.id = s.sessiontype_id) 
     WHERE g.user_id = 21 
     group by g.id 
     having(question_count = answer_count) 
     order by finished DESC; 

ich will, dass die Unterabfrage den geänderten Wert von Antworten gibt, wo die ID durch Spiel die höchste gruppiert ist.

so versuchte ich select max(id) as maxid... und die maximale ID in der Unterabfrage verwenden. where a.id = maxid. Netter Versuch, aber nicht arbeiten. mysql Fehler ist dieser: Reference 'maxid' not supported (reference to group function)

kann jemand einen Hinweis geben, wie man das löst?

Antwort

0

Beitreten zu einer Unterabfrage, die MAX(answers.id) gruppiert von answers.game_id zurückgibt.

Verwenden Sie dann maxid, um auf der answers Tabelle beizutreten, um die Zeile der entsprechenden answers.id zu erhalten.

Nicht sicher, wie Ihr Ergebnis aussehen soll, in Ihrer Auswahl habe ich a.modified AS finished, entfernt und ersetzt durch die modified Spalte der Zeile mit maxid.

SELECT 
    st.title, 
    count(q.id) AS question_count, 
    sum(
     CASE 
     WHEN a.answer IS NOT NULL THEN 
      1 
     ELSE 
      0 
     END 
    ) AS answer_count, 
    g.user_id AS game_user_id, 
    a.maxid, 
    a.game_id AS a_game_id, 
    modifiedAnswer.modified AS finished, 
FROM 
    games g 

LEFT JOIN (SELECT MAX(answers.id) AS maxid, game_id FROM answers GROUP BY answers.game_id) AS a ON (a.game_id = g.id) 
LEFT JOIN answers AS modifiedAnswer ON modifiedAnswer.id = a.maxid 

LEFT JOIN questions q ON (a.question_id = q.id) 
LEFT JOIN sessions s ON (s.id = q.session_id) 
LEFT JOIN sessiontypes st ON (st.id = s.sessiontype_id) 
WHERE 
    g.user_id = 21 
GROUP BY 
    g.id 
HAVING 
    (
     question_count = answer_count 
    ) 
ORDER BY 
    finished DESC; 
+0

Hm, ich glaube ich weiß was du meinst. aber deine Abfrage funktioniert nicht. ;) –

+0

Kannst du Daten angeben? + erwartetes Ergebnis, + Fehlermeldung für diese Abfrage. Obwohl ich denke, dass ich den Alias ​​in der Unterabfrage durcheinander gebracht habe, lege ihn hinter game_id statt nach id. In der Abfrage behoben – Philipp

+0

Ja, das war das Problem. Danke für das. Nein, ich bekomme, was ich will :) diese sql ist sehr verwirrend: P –