mysql rechnen mit dem Ergebnis von COUNT(*) AS

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

mysql rechnen mit dem Ergebnis von COUNT(*) AS

Beitrag von Xwitz »

Hallo,

ich möchte eine Abfage nach der Differenz zwischen dem Wert (anzahl) aus COUNT(*) AS und einer Variable $var sortieren.

Das:

Code: Alles auswählen

$sql = "SELECT COUNT(*) AS anzahl, eintrag_id FROM tabelle WHERE t_id = *** AND t_id ... GROUP BY eintrag_id ORDER BY anzahl DESC";
funktioniert (das ist nur noch nicht das was ich will) und

Code: Alles auswählen

ORDER BY ABS(anzahl - " . $var . ") DESC"
funktioniert, wenn anzahl eine Spalte ist. Aber anzahl ist keine Spalte und das:

Code: Alles auswählen

$sql = "SELECT COUNT(*) AS anzahl, eintrag_id FROM tabelle WHERE t_id = *** AND t_id ... GROUP BY eintrag_id ORDER BY ABS(anzahl - " . $var . ") DESC"
funktioniert nicht. Da bekommen ich die Fehlermeldung, Unknown column 'anzahl' in 'order clause'.

Wie kann ich mein Anliegen realisieren?
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag von Miriam »

Ich verstehe den Sinn dieser Query nicht ganz aber gut:

Versuche -->

Code: Alles auswählen

$sql = "SELECT COUNT(t_id) AS anzahl, eintrag_id FROM tabelle WHERE t_id = *** AND t_id ... GROUP BY eintrag_id ORDER BY ABS(t_id - " . $wortzahl . ") DESC"
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag von Xwitz »

Da passiert da gleiche, hätte mich auch etwas gewundert, wenn es was gebracht hätte.

Ich habe die Variable jetzt auch in dem dritten Codeabschnitt durch $var ersetzt, falls es dem Verständnis hilft.

Im ersten Codeabschnitt würde die eintrag_id an erster Stelle stehen, die am häufigsten als Paar mit einer der t_ids Auftritt. Ich suche aber nicht nach den meisten Übereinstimmungen sondern nach einer bestimmten Häufigkeit ($var) und möchte die, die von $var abweichen aber auch noch haben, nur eben mit steigender Abweichung.

PS: Durch DESC ist es im Moment verkehrt herum aber das ist nicht der Grund warum die Abfrage nicht geht.
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag von Miriam »

Kannst Du mal bitte ein Tabellenbeispiel geben?
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag von Xwitz »

Code: Alles auswählen

|eintrag_id|t_id|
|1         |1   |
|1         |2   |
|1         |3   |
|2         |2   |
|2         |4   |
|3         |2   |
|3         |5   |
|4         |5   |
Wenn in WHERE für t_id die 2 und die 1 angegeben ist und $var = 3, sollte die eintrag_id 1 (mit zwei Paaren) als erstes kommen dann die 2 und 3 (mit je einem Paar).

Für die t_id 5 und 2 und $var = 1 sollten die eintrag_ids 4, 2 und 1 (mit je einem Paar) zu erst kommen und dann 3 (mit zwei Paaren).

EDIT: die Bedingung $var = * ergänzt.

PS: eintrag_ids mit Null Paaren sollen aber nicht in der Ausgabe dabei sein. Die Variante, daß $var kleiner ist als die minmal vorkommende Zahl an Paaren kann nicht eintreten, falls das hilft.
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag von Miriam »

Mal sehen, ob ich Dich richtig verstanden habe:

Code: Alles auswählen

$sql = "SELECT  count(eintrag_id) as anzahl, ABS(count(eintrag_id) - $var) as abweichung, eintrag_id FROM tabelenname WHERE t_id in (1,2) GROUP BY eintrag_id order by abweichung asc, anzahl desc, eintrag_id asc 
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag von Xwitz »

Das:

Code: Alles auswählen

$sql = "SELECT ABS(COUNT(*) - $var) AS d_anzahl, eintrag_id FROM tabelle WHERE t_id IN ('$in') GROUP BY eintrag_id ORDER BY d_anzahl ASC";
scheint auszureichen, vielen Dank. Im Moment habe ich was anderes verschlimmbessert und muß es später noch mal genau prüfen.
Antworten

Zurück zu „Coding & Technik“