Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL verschachtelte Auswahl

Ich habe eine Antwort auf die vorherige Frage hinzugefügt, bitte beziehen Sie sich zum Verständnis zuerst darauf.

Sie können es nicht von bb_ratings erhalten allein, indem Sie es gruppieren und hacken. Sie erhalten Null, weil Sie an ein Gitter denken, nicht an relationale Mengen (das ist das zentrale Konzept des relationalen Modells).

  1. Bevor Sie entscheiden, welche Tabelle(n) Sie aufrufen möchten, um Ihre Abfrage zu bedienen, müssen Sie entscheiden, was Sie für die Struktur Ihrer Ergebnismenge wünschen.

  2. Dann beschränken Sie es (welche Zeilen) mit WHERE Klausel.

  3. Finden Sie dann heraus, woher (welche Tabellen) Sie die Spalten bekommen. Entweder Joins mit mehr Tabellen oder mehr Arbeit am WHERE Klausel; oder skalare Unterabfragen, korreliert mit der äußeren Abfrage.

Dir ist nicht klar, was du willst. Es sieht so aus, als ob Sie denselben Bericht wie in der vorherigen Frage wünschen, plus eine Spalte für die Abstimmung der gegebenen Benutzer. Für mich ist die Struktur Ihrer Ergebnismenge eine Liste von Bulletins. Nun, ich kann das aus bulletin bekommen , Sie müssen nicht zu bulletin_like gehen und muss das dann GRUPPIEREN.

Wenn Sie in Sätzen denken, ist es sehr einfach, Sie müssen nicht durch Reifen mit materialisierten Ansichten oder "verschachtelten" Abfragen springen:

SELECT name AS bulletin, 
    (SELECT COUNT(like) 
        FROM  bulletin_like bl 
        WHERE bl.bulletin_id = b.bulletin_id 
        AND   like = 1
        ) AS like,
    (SELECT COUNT(like) 
        FROM  bulletin_like bl 
        WHERE bl.bulletin_id = b.bulletin_id 
        AND   like = 0
        ) AS dislike,
    (SELECT COUNT(like) 
        FROM  bulletin_like bl 
        WHERE bl.bulletin_id = b.bulletin_id 
        AND   bl.user_id = {$user_d}
        AND   like = 1
        ) AS your_vote
    FROM bulletin b

Antworten auf Kommentare

Ich habe das Gefühl, dass das, was Sie sagen, sehr wichtig für meine Herangehensweise an SQL ist

  1. Ja absolut. Wenn Sie bereit sind, die richtigen Dinge im Voraus zu lernen, wird es:

    • ersparen Ihnen später alle möglichen Probleme
    • Machen Sie Ihre Abfragen effizienter
    • schnelleres Programmieren
      .
  2. Vergessen Sie vorerst die Verwendung von Ergebnismengen als Tabellen (viel langsamer) und temporäre Tabellen (definitiv nicht erforderlich, wenn Ihre Datenbank normalisiert ist). Du bist viel besser dran, die Tabellen direkt abzufragen. Sie müssen verschiedene Themen wie das relationale Modell lernen; wie man SQL verwendet; wie nicht SQL verwenden, um Probleme zu vermeiden; usw. Ich bin bereit, Ihnen zu helfen und eine Weile bei Ihnen zu bleiben, aber ich muss wissen, dass Sie bereit sind. Es wird ein bisschen hin und her dauern. Es gibt ein bisschen Lärm auf dieser Seite, also werde ich andere Kommentare (bis zum Ende) ignorieren und nur auf deine antworten.

    • beenden Sie die Verwendung von GROUP BY , behindert es ernsthaft Ihr Verständnis von SQL. Wenn Sie den gewünschten Bericht nicht erhalten können, ohne GROUP BY zu verwenden , stellen Sie eine Frage.
      .
  3. Diese gepostete Frage. Lassen Sie mich wissen, an welchem ​​Punkt Sie sich verlaufen haben, und ich werde ab diesem Zeitpunkt weitere Einzelheiten bereitstellen.

    • Für diese Frage möchten Sie eine Liste von Bulletins mit Likes; Abneigungen; und dieser Benutzer mag. Ist das korrekt ? Haben Sie den von mir bereitgestellten Code ausprobiert?
      .
  4. Die verknüpfte Frage angesehen. Es ist ein Durcheinander, und niemand hat sich mit dem tieferen Problem befasst; sie haben das Problem an der Oberfläche isoliert gelöst. Sie haben jetzt eine Antwort, aber Sie verstehen sie nicht. Das ist ein sehr langsamer Weg, um Fortschritte zu machen.