2017-08-26 4 views
0

Ich versuche, in einer Eins-zu-viele-Beziehung childs, wo Datensätze von childs ist 1 zu wählen. Zum Abrufen von Childs mit einem Datensatz verwende ich die folgende Abfrage.mysql group von wo mit gibt völlig andere Ergebnisse zurück

Hier ist die einfache Abfrage, die funktioniert, wenn ich nicht where Anweisung verwende

select a.iid, 
account_id, 
count(*) as props 

from accounts_prop a 
group by a.account_id 
having props = 1 

wenn ich where verwende ich wieder völlig anderes Ergebnis. In diesem Fall habe ich Aufzeichnungen erhalten, die zeigt, dass Requisiten 1 Datensatz haben aber tatsächlich mehr als eine

select a.iid, 
    account_id, 
    count(*) as props 

    from accounts_prop a 
    where a.von >= '2017-08-25' 
    group by a.account_id 

having props = 1 

mit Was ich in diesem Fall bin fehlt

+0

die beiden Abfrage sind unterschiedlich die ersten beziehen Sie alle Ihre Zeilen die zweite nur die Zeilen mit a.von> = '2017-08-25' dann haben Sie verschiedene Sätze von Zeile für die Gruppierung .. Ihre Frage ist nicht klar .. versuchen Sie es besser zu erklären – scaisEdge

Antwort

0

Bei genauerem Hinsehen Ihre ursprüngliche Abfrage ist nicht einmal bestimmt :

SELECT 
    a.iid,    -- OK, but which value of iid do we choose? 
    a.account_id, 
    COUNT(*) AS props 
FROM accounts_prop a 
GROUP BY a.account_id 
HAVING props = 1 

die Abfrage macht keinen Sinn, weil Sie die iid Spalte auswählen, während auf anderen Spalten aggregiert werden. Welcher Wert von iid sollte für jedes Konto ausgewählt werden? Dies ist nicht klar, und Ihre Abfrage würde nicht einmal auf bestimmten Versionen von MySQL oder den meisten anderen Datenbanken laufen.

Stattdessen setzen Sie Ihre Logik Konten zu finden, mit nur einem einzigen Datensatz in einer Unterabfrage, und dann zu dieser Unterabfrage kommen Sie mit den vollständigen Datensätze für jedes Spiel zu bekommen:

SELECT a1.* 
FROM accounts_prop a1 
INNER JOIN 
(
    SELECT account_id 
    FROM accounts_prop 
    GROUP BY account_id 
    HAVING COUNT(*) = 1 
) a2 
    ON a1.account_id = a2.account_id 
WHERE a1.von >= '2017-08-25' 
+0

vielen Dank für die detaillierte Erklärung! – fefe

1

die where Bedingung Filter Sie ursprünglichen Reihen so

where a.von >= '2017-08-25' 

die Anzahl der Zeilen in Abfrage

die having-Klausel Arbeit auf dem Ergebnis einer Abfrage beteiligt reduzieren so in Sie Filter mit dem (oder keine t) Sie erhalten anderes Ergebnis
In Ihrem Fall in der ersten Abfrage Ihrer Zählung wird auf alle Zeilen in Ihrer in der zweiten Abfrage berechnen Sie Ihre Zahl berechnet wird, nur auf einer Teilmenge

Dies kann erklären, warum Sie verschiedene Resul erhalten aus die zwei Abfrage

Verwandte Themen