Thorsten: Treffer aus zweiter Tabelle zählen

Ich habe zwei Tabellen. Ich frage die erste Tabelle ab und gebe sie anschliessend über PHP,HTML aus.

SELECT id, name FROM games ORDER BY id DESC

Das mache ich über eine Tabelle, in einer WHILE Schleife!

Bei jedem Durchgang berechne ich die Anzahl der Treffer in einer weiteren Tabelle

SELECT count(*) AS anzahl FROM games_player WHERE id_player='$abfrage_treffer_von_erster_abfrage->id'

So das ich am Schluss folgendes Habe:

id! Name    ! Treffer
1 ! andreas ! 20
2 ! berta   ! 12
3 ! Artur   ! 1

Ich denke das, das eigentlich sehr bescheuert ist, nun würd ich gerne meine beiden SELECT Anweisungen zu einer einzigen zusammenfügen.
Kann mir jemand dabei helfen?

Thorsten

  1. Ich denke das, das eigentlich sehr bescheuert ist, nun würd ich gerne meine beiden SELECT Anweisungen zu einer einzigen zusammenfügen.

    Du möchtest Dich mit JOIN MySQL beschäftigen.

    SELECT a.`id`, a.`name`, b.`anzahl`  
    FROM a.`games`  
    LEFT JOIN b.`games_player` ON b.`id_player` = a.`id`  
    ORDER BY a.`id` DESC
    

    LG
    Jenny

    1. SELECT a.id, a.name, b.anzahl

      FROM a.games
      LEFT JOIN b.games_player ON b.id_player = a.id
      ORDER BY a.id DESC

      Nur zur Info (hab ich im ersten Posting vergessen):  
      Der o.a. Code ist NICHT 1:1 übertragbar, weil die Syntax nicht stimmt. Du musst Dich schon mit dem Thema beschäftigen. ;)  
        
        
      LG  
      Jenny
      
      1. Hi!

        Der o.a. Code ist NICHT 1:1 übertragbar, weil die Syntax nicht stimmt. Du musst Dich schon mit dem Thema beschäftigen. ;)

        Es muesst auch noch n count und n group by rein.

        --
        Signaturen sind bloed.
  2. Tach!

    Ich denke das, das eigentlich sehr bescheuert ist, nun würd ich gerne meine beiden SELECT Anweisungen zu einer einzigen zusammenfügen.

    Das geht zum Beispiel mit einer Correlated Subquery à la:

    SELECT felder, (SELECT COUNT(*) FROM tabelle2 WHERE tabelle1.feld=tabelle2.feld) aliasname FROM tabelle1

    dedlfix.

  3. SELECT count(*) AS anzahl FROM games_player WHERE id_player='$abfrage_treffer_von_erster_abfrage->id'

    Ein SELECT count() dürfte ohne GROUP BY einen Fehler verursachen.

    Vorgehensweise: Du ergänzt die Personentabelle mit der Treffertabelle:

    SELECT  
     ...  
    FROM games_player  
    LEFT JOIN games  
    ON games.player_id = games_player.id
    

    gruppierst die Datensätze nach Person und zählst sie pro Person:

    SELECT  
     ...  
    ,count(*) AS treffer  
    FROM games_player  
    LEFT JOIN games  
    ON games.player_id = games_player.id  
    GROUP BY games_player.id  
    ORDER BY treffer DESC
    

    Linuchs

    1. Tach!

      SELECT count(*) AS anzahl FROM games_player WHERE id_player='$abfrage_treffer_von_erster_abfrage->id'
      Ein SELECT count() dürfte ohne GROUP BY einen Fehler verursachen.

      Nein, macht es nicht.

      gruppierst die Datensätze nach Person und zählst sie pro Person:

      SELECT

      ...
      ,count(*) AS treffer
      FROM games_player
      LEFT JOIN games
      ON games.player_id = games_player.id
      GROUP BY games_player.id
      ORDER BY treffer DESC

        
      Und dann fangen die Probleme an. Unter MySQL ist es möglich, auch nach Feldern zu selektieren, die nicht in der GROUP-BY-Klausel angegeben sind. (Aggregatfunktionen wie SUM() oder COUNT() gehen allerdings immer.) Andere DBMSe betrachten das als Fehler. Es ist nämlich nicht eindeutig, aus welchem der vielen Datensätze je Gruppe der Wert genommen werden soll. Das Ergebnis kann durchaus wie gewünscht ausfallen, muss es aber nicht.  
        
      Wenn man lediglich einen einzelnen Wert (auch berechnet) aus einer anderen Tabelle braucht, macht sich eine (correlated) Subquery einfacher als ein Join. Und man ist mit der Felderliste der ersten Tabelle flexibler.  
        
        
      dedlfix.
      
      1. Moin!

        Und dann fangen die Probleme an. Unter MySQL ist es möglich, auch nach Feldern zu selektieren, die nicht in der GROUP-BY-Klausel angegeben sind. (Aggregatfunktionen wie SUM() oder COUNT() gehen allerdings immer.) Andere DBMSe betrachten das als Fehler. Es ist nämlich nicht eindeutig, aus welchem der vielen Datensätze je Gruppe der Wert genommen werden soll. Das Ergebnis kann durchaus wie gewünscht ausfallen, muss es aber nicht.

        Mann. Das hatte ich glatt vergessen. Ich bewege mich wohl zuviel unter MS Produkten. Frueher hab ich auch immer lustig joins mit Aggregatfunktionen benutzt, bis ich dann auf Access und SQL Server gestossen bin. Das is immer ein Geraffel mit der Gruppierung, auch im Designmodus der jeweilgen MS Software, nur weil man ein Feld von 10 summiert haben will... Da bin ich irgendwann zu subqueries uebergegangen.

        Danke fuer die Flashbacks...

        --
        Signaturen sind bloed.