Frage

Ich habe eine MySQL-Abfrage wie folgt aus:

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;

Ich möchte die Ergebnisse Zeilen, in denen Vorkommen> 0 beschränken. Das scheint mir sehr einfach, aber ich kann nicht zu machen scheinen, um es zu arbeiten. Egal, was ich versuche, WHERES oder havings, wenn ich versuche, diese Einschränkung ich keine Zeilen im Gegenzug hinzuzufügen. Ich bin sicher, dass es Daten in meiner Tabelle ist, die zurückgegeben werden sollen. Wer weiß, wie zu tun, was ich tue?


Ich habe dies versucht, aber es funktioniert immer noch nicht. Irgendwelche Ideen, warum es immer noch nicht funktionieren?

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" HAVING SUM(...some SQL removed for brevety)>0 GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;
War es hilfreich?

Lösung

ich mit MySQL nicht so vertraut bin, wie ich mit SQL Server bin, aber in T-SQL, können Sie keine Aliase in GROUP BY-Klauseln verwenden (ich dachte ursprünglich ORDER BY-Klauseln als gut, aber dass da gezeigt wurde, als falsch). In diesem Fall mögen Sie auf den Ergebnissen eines GROUP BY filtern, so würde ich eine HAVING-Klausel wie folgst:

SELECT *, SUM(... some SQL removed for brevity ...) AS Occurrences
FROM
    some_table AS q
WHERE
    criterion = 'value'
GROUP BY
    q.P_id
HAVING
    SUM(... some SQL removed for brevity ...) > 0
ORDER BY
    Occurrences DESC
LIMIT 10;

Andere Tipps

Diese Abfrage funktioniert für mich ...

select order_id, sum(qty_ordered) as total_qty 
from sales_flat_order_item 
group by order_id 
having total_qty > 10
order by total_qty desc

Ach, ich habe den Platz für sie gefunden.

Die Aussage ist nun:

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id HAVING SUM(...some SQL removed for brevety)>0 ORDER BY Occurrences DESC LIMIT 10;

Es scheint, mit ORDER BY Vorkommen adaequat zu sein,

Ich glaube, Aggregate in der HAVING Klausel sein sollten. Obwohl zugegebenermaßen, ich bin nicht sicher, ob Aliase akzeptiert werden.

HAVING (Occurrences > 0)

HAVING (SUM(...some SQL removed for brevety) > 0)

Alternativ können Sie auch eine Unterabfrage verwenden:

SELECT *
FROM (
   -- your current query
) AS sub
WHERE (Occurences > 0)

Nach dem SQL-Standard sind die Spaltenaliasnamen in dem Körper der Abfrage nicht zur Verfügung, die ein verfluchtes Ärgernis ist. Nach dem, was Sie versucht haben, klingt es, als ob das gleiche gilt für MySQL (und einigen anderen DBMS). Sie werden wahrscheinlich den Ausdruck in der ORDER BY-Klausel wiederholen.

Auch sollte die GROUP BY-Klausel alle Spalten aufgelistet, die in dem * ist nicht nur der Primärschlüssel (wenn auch logischerweise sollte den Primärschlüssel Angabe ausreichend sein).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top