tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von Yaslaw
  • 1 Beitrag von gorefest
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
1435
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    fixxxxxi fixxxxxi ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    132
    Hallo,

    ich möchte eine Datenbankabfrage machen bei welcher auf zwei Tabellen zugegriffen werden muss. Jedoch komm ich irgendwie damit nicht weiter.

    Diese Abfrage funktioniert soweit, nur weiß ich nicht, wie ich nun auch noch ein COUNT() einbauen kann, denn ich möchte das Ergebnis als Zahl ausgegeben haben.


    Code sql:
    1
    2
    3
    4
    5
    6
    7
    
    SELECT ic1_wars.id, ic1_wars.wlp, ic1_warmember.wid, ic1_warmember.aktion, ic1_warmember.uid 
    FROM ic1_wars 
    INNER JOIN ic1_warmember ON (ic1_wars.id = ic1_warmember.wid) 
    WHERE ic1_warmember.uid=1 
    AND ic1_wars.wlp=1 
    AND ic1_warmember.aktion=1
    GROUP BY ic1_wars.id, ic1_wars.wlp, ic1_warmember.wid, ic1_warmember.aktion, ic1_warmember.uid

    Mein Lösungsansatz, bei welchem allerdings einfach nur ein Feld COUNT(*) erstellt wird, wo überall eine 1 drin steht:

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    
    SELECT COUNT(*), ic1_wars.id, ic1_wars.wlp, ic1_warmember.wid, ic1_warmember.aktion, ic1_warmember.uid 
    FROM ic1_wars 
    INNER JOIN ic1_warmember ON (ic1_wars.id = ic1_warmember.wid) 
    WHERE ic1_warmember.uid=1 
    AND ic1_wars.wlp=1 
    AND ic1_warmember.aktion=1
    GROUP BY ic1_wars.id, ic1_wars.wlp, ic1_warmember.wid, ic1_warmember.aktion, ic1_warmember.uid

    Wie lass ich mir die Zahl ausgeben? Thx 4 help!
     

  2. #2
    gorefest gorefest ist offline Mitglied Brokat
    Registriert seit
    Apr 2009
    Beiträge
    256
    Hi,

    das Problem ist, dass Du die ID mit in die Selektion nimmst

    Da es pro ID immer einen Record gibt, bekommst Du überall "1" als Count.

    Bei einer SQL GROUP BY erzeugt das Group by einen set aus Records, die Du dann mit einem Aggregationsoperator verarbeiten kann.

    Beispiel :

    Folgende Tabelle BAZ_TABLE sei gegeben :

    FOO_ID
    1
    1
    1
    2
    2
    3


    Code :
    1
    2
    3
    
    SELECT FOO_ID, COUNT(*) AS ANZ
        FROM BAZ_TABLE
    GROUP BY FOO_ID

    Das Group By erzeugt intern sowas :

    1 -> [row1,row2,row3];
    2 -> [row3,row4]
    3 -> [row5]

    Du kannst nun auf diese rows mit einem aggregationsoperator zugreifen (z.B. COUNT) erzeugt dann :

    1 -> 3
    2 -> 2
    3 -> 1

    Hoffe, es hilft

    Grü0e
    gore
     

  3. #3
    gorefest gorefest ist offline Mitglied Brokat
    Registriert seit
    Apr 2009
    Beiträge
    256
    Ah, so gehts mit dem Zitat

    Dein Problem sollte sich so beheben :

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    
    SELECT COUNT(*),  ic1_wars.wlp, ic1_warmember.aktion, ic1_warmember.uid 
    FROM ic1_wars 
    INNER JOIN ic1_warmember ON (ic1_wars.id = ic1_warmember.wid) 
    WHERE ic1_warmember.uid=1 
    AND ic1_wars.wlp=1 
    AND ic1_warmember.aktion=1
    GROUP BY ic1_wars.wlp,ic1_warmember.aktion, ic1_warmember.uid

    Grützi
     

  4. #4
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Was willst du genau Zählen?

    Dein Lösungsansatz müsste eigentlich schon Stimmen, obwohl ich das ganze Verschachteln würde

    Wenn ich jedoch deine Eingrenzungen sehe, denke ich das du alles eindeutige Zeilen kriegst. Diese Gruppiert über alle Felder ergibt Einer-Gruppen.

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    SELECT COUNT(DATA.*), DATA.*
    FROM
        (SELECT 
            w.id, 
            w.wlp, 
            wm.wid, 
            wm.aktion, 
            wm.uid
        FROM 
            (SELECT id, wlp FROM ic1_wars WHERE wlp=1) AS w
            INNER JOIN (SELECT wid, aktion, uid FROM ic1_warmember WHERE uid=1 AND aktion=1) AS wm
                ON (w.id = wm.wid)
        ) AS DATA
    GROUP BY 
        DATA.id, 
        DATA.wlp, 
        DATA.wid, 
        DATA.aktion, 
        DATA.uid
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  5. #5
    gorefest gorefest ist offline Mitglied Brokat
    Registriert seit
    Apr 2009
    Beiträge
    256
    Zitat Zitat von yaslaw Beitrag anzeigen
    Was willst du genau Zählen?

    Dein Lösungsansatz müsste eigentlich schon Stimmen, obwohl ich das ganze Verschachteln würde
    Das mit dem Verschachteln sollte man sich gut überlegen. Bei modernen Datenbanken und großen Datenmengen ist damit kein indexbasiertes GROUP BY mehr möglich.

    Grüße
    gore
     

  6. #6
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Das GROUP BY nicht, dafür das WHERE. Wenn im Endeffekt kleine Datenmengen herauskommen, ist es ev. schneller zuerst die Datenmenge zu reduzieren, dann die Daten zusammenzufügen.

    Gerade wenn über etwa alle Felder Gruppiert wird, gitbs eh kein indexbasiertes Gruppieren mehr.
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  7. #7
    gorefest gorefest ist offline Mitglied Brokat
    Registriert seit
    Apr 2009
    Beiträge
    256
    Gerade wenn über etwa alle Felder Gruppiert wird, gitbs eh kein indexbasiertes Gruppieren mehr.
    Müsste es nicht heissen : Gerade wenn über etwa alle Felder Gruppiert wird, gitbs eh kein brauchbares Ergebnis mehr ?

    Welchen Sinn macht es über alle Felder zu gruppieren? Dann kann man das GroupBy auch weglassen.

    Ansonsten stimme ich natürlich zu, Subselects sind besser lesbar.

    Allerdings würde ein Subselect im InnerJoin dem Optimizer wohl den Rest geben :

    Code :
    1
    2
    3
    
    (SELECT id, wlp FROM ic1_wars WHERE wlp=1) AS w
            INNER JOIN (SELECT wid, aktion, uid FROM ic1_warmember WHERE uid=1 AND aktion=1) AS wm
                ON (w.id = wm.wid)

    Damit dürfte die Anwendung jeglicher Statistiken für effizientes Joinen / Einschränken unmöglich gemacht werden.

    Bei einem

    Code :
    1
    2
    3
    4
    5
    
         SELECT id, wlp FROM ic1_wars AS w
            INNER JOIN warmember  AS wm
                   ON w.id = wm.wid
          WHERE uid=1 AND aktion=1
             AND wlp=1

    kann der Optimizer zumindestens noch entscheiden, von welcher Richtung er einschränken will. Gibts keinen Index of auf UID und aktion erzwingst Du mit Deiner Abfrage automatisch einen Full-Table-Scan.

    Grüße,
    gore
    Geändert von gorefest (09.03.10 um 13:52 Uhr)
     

  8. #8
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Zitat Zitat von gorefest Beitrag anzeigen
    Müsste es nicht heissen : Gerade wenn über etwa alle Felder Gruppiert wird, gitbs eh kein brauchbares Ergebnis mehr ?

    Welchen Sinn macht es über alle Felder zu gruppieren? Dann kann man das GroupBy auch weglassen.
    Ja, so sollte es heissen.
    Richtig, der Group By macht dann kein Sinn....so hat er es aber......

    Wie man das SQL mit Unterabfragen aufbauen soll und was der Optimizer daraus macht, können wir beide hier nicht beurteilen. Performance-Verbesserungen sind keine reinen Theorien, man muss sie austesten da viele Faktoren miteinfliessen. Darum gibts auch selten das einzig richtige Query.
    fixxxxxi bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  9. #9
    gorefest gorefest ist offline Mitglied Brokat
    Registriert seit
    Apr 2009
    Beiträge
    256
    Zitat Zitat von yaslaw Beitrag anzeigen
    Wie man das SQL mit Unterabfragen aufbauen soll und was der Optimizer daraus macht, können wir beide hier nicht beurteilen. Performance-Verbesserungen sind keine reinen Theorien, man muss sie austesten da viele Faktoren miteinfliessen. Darum gibts auch selten das einzig richtige Query.
    Eben, mit Theorie hat Performancetuning nix zu tun Eher was mit best practices und gesundem Menschenverstand (3NF, FK-Indexes etc), die größtenteils datenbankübergreifend funktionieren. . Da hier der Einsatz von MySQL aber am hier wahrscheinlichsten ist, ist eine Diskussion über Optimizer mangels Optimizer hier wohl eh müßig

    Grüße,
    gore
    fixxxxxi bedankt sich. 

Ähnliche Themen

  1. LEFT JOIN mit COUNT-Funktion
    Von sandroP im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 14.09.09, 17:54
  2. Column count doesn't match value count at row 1
    Von strolch_007 im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 09.03.09, 00:08
  3. Count von Join-Einträgen
    Von ev0lst im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 30.01.09, 22:15
  4. Antworten: 5
    Letzter Beitrag: 21.02.05, 00:23
  5. mit JOIN -> COUNT ähnliche Felder
    Von Partymann im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 05.04.04, 09:46