count Problem

Online-Skater

Erfahrenes Mitglied
Hallo

Ich habe folgendes Problem, ich möchte eine kleine Statistik ausgeben mit möglichst einem Query (Optimal).

Tabelle:
Code:
id int( 14 ) AUTO_INCREMENT PRIMARY KEY NOT NULL ,
spt smallint( 2 ) NOT NULL ,
heim varchar( 50 ) NOT NULL ,
gast varchar( 50 ) NOT NULL ,
erg varchar( 5 ) NOT NULL ,
htor smallint( 2 ) NOT NULL ,
gtor smallint( 2 ) NOT NULL
Einzele Abfragen
Code:
$sql1 = "SELECT count(id) as anzahl,SUM(htor) as tore,SUM(gtor) as gtore FROM ds_bundesliga;";
  $sql2 = "SELECT count(id) as siege FROM ds_bundesliga WHERE htor > gtor;";
  $sql3 = "SELECT count(id) as gleich FROM ds_bundesliga WHERE htor = gtor;";
MYSQL-Versuch ohne Tor abfrage
Code:
SELECT count(a.id) as anzahl, count(b.htor) as siege, count(c.htor) as gleich FROM ds_bundesliga as a JOIN ds_bundesliga as b ON b.htor > b.gtor JOIN ds_bundesliga as c ON c.htor = c.gtor;

Aber hier gibt er mir 3mal das gleiche aus. Multi Selects unterstützt mein Server nicht, ich wäre dankbar für eine Variante die funktioniert.
 
Zuletzt bearbeitet:
Du kannst mit sum( [Bedingung] ) as [alias] arbeiten.
True wird dabei als 1, false als 0 gewertet.

Die where-Klauseln und die joins fallen dabei dann weg.

Gruß hpvw
 
Vielen Dank funktioniert einwandfrei. ;)

Wusste nicht das man hinter SUM() eine Bedingung reinschreiben kann das ist natürlich praktisch.
 
Hallo ein neues Problem :confused:

Ich möchte in meinem Forum die Anzahl der Threads und Posts in einer Mysql-Abfrage abfragen.
Ansatz:
Code:
SELECT  count( `a`.`tid` ) AS `n_top` , count( `b`.`pid` ) AS `n_pos`
FROM `mk_forum_topic` AS `a`
JOIN `mk_forum_post` AS `b`;
Ergebnis:
Code:
 n_top  	 n_pos
 10881 	        10881
Erwartetes Ergebnis: n_top = 31,n_pos 351

Resultat ist das die beiden Mengen multipliziert werden.
Frage: Warum ist das so und wie geht es richtig.

Thx
 
Ganz einfach: Der einfache JOIN führt zu einem Kreuzprodukt. Alle Einträge der einen werden mit allen Einträgen der anderen Tabelle dargestellt. Das führt dann eben zu einer Multiplikation der Einträge. Solltest also kein einfaches JOIN benutzen.
 
Probier mal eine einfache Abfrage ohne Join:
Code:
SELECT
        COUNT( `a`.`tid` ) AS `n_top`,
        COUNT( `b`.`pid` ) AS `n_pos`
  FROM
        `mk_forum_topic` AS `a`,
        `mk_forum_post` AS `b`;
Nachtrag: Ui, da war jemand trotz vorangeschrittener Uhrzeit doch schneller.
 
Und muss dich darauf hinweisen dass die Notation von zwei Tabellen durch ein Komma getrennt in dem Fall genau der eines JOIN (und CROSS JOIN etc.) entspricht. Probiers mal aus ;)

Vorschlag: Wenn es nichts zu JOINEN gibt fallen mir gerade nur subselects ein.... die bei dir wohl nicht gehen?
Was ist mit UNION ... äh ja sind auch subselects. Ich muss erstmal schlafen...
 
Zuletzt bearbeitet:
Hallo Danke zeja mit Subselect klappt es bestens, gut das ich Mysql in der Version 4.1.20 hab :)

Code:
SELECT count(`pid`) AS `n_pos`,(SELECT count(`tid`) FROM `mk_forum_topic`) AS `n_tid`
FROM `mk_forum_post`;

Thx
 
Zurück