2016-04-10 12 views
0
SET @v1 := (SELECT questor.questioncart.idQuestionCart FROM questioncart WHERE User_username = "eamin" ORDER BY idQuestionCart DESC LIMIT 1); 
SET @v2 := (SELECT questor.questioncart_has_question.Question_idQuestion FROM questioncart_has_question WHERE QuestionCart_idQuestionCart = @v1); 
SELECT questor.question.questionText FROM question WHERE idQuestion = @v2; 

In dieser MySQL-Abfrage I "Subquery liefert mehr als 1 Zeile" Störung erhalten. MySQL zeigt die zweite Abfrage (@ v2) als den Fehler an, der einen erstellt. Was kann ich tun, um dieses Problem zu lösen? Können Sie mir eine optimierte MySQL für meine gegebene Abfrage zur Verfügung stellen, die das Problem lösen wird?MySQL Fehler: Unterabfrage gibt mehr als 1 Zeile zurück. Wie kann ich diese Abfrage optimieren?

+2

Bitte erläutern Sie, was Sie zu tun versuchen. Beispieldaten und gewünschte Ergebnisse helfen viel, viel mehr als nicht funktionierende Abfragen. –

+0

Nun, Sie einfach LIMIT 1 hinzufügen könnte - aber ob das dann den Wert aus dem aktuellen Datensatz auswählen (der mehrere diejenigen, die WHERE Kriterien übereinstimmen, die offensichtlich vorhanden sind) Sie wollen, ist fraglich ... – CBroe

Antwort

0

entweder Sie haben LIMIT 1 in der Abfrage verwenden:

SET @v2 := (SELECT questor.questioncart_has_question.Question_idQuestion 
      FROM questioncart_has_question 
      WHERE QuestionCart_idQuestionCart = @v1 
      LIMIT 1); 

oder die letzte Abfrage wie folgt konvertieren:

SELECT questor.question.questionText 
FROM question 
WHERE idQuestion IN (SELECT questor.questioncart_has_question.Question_idQuestion 
      FROM questioncart_has_question 
      WHERE QuestionCart_idQuestionCart = @v1) 

Es hängt von Ihren Geschäftsregeln und den tatsächlichen Anforderungen.

0

Sie sollten die Abfrage als einzelne Abfrage ausführen. Lassen Sie MySQL die Optimierung für Sie tun. Zumindest spart dies die Zeit, die für mehrere Abfragen an die Datenbank zurückgeht:

SELECT q.questionText 
FROM question q 
WHERE idQuestion IN (SELECT qchq.Question_idQuestion 
        FROM questioncart_has_question qchq JOIN 
          (SELECT qc.idQuestionCart 
          FROM questioncart qc 
          WHERE User_username = 'eamin' 
          ORDER BY idQuestionCart DESC 
          LIMIT 1 
         ) qc 
          ON qchq.QuestionCart_idQuestionCart = qc.idQuestionCart 
        ); 
Verwandte Themen