2Danke
ERLEDIGT
JA
JA
ANTWORTEN
8
8
ZUGRIFFE
1435
1435
EMPFEHLEN
-
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!
-
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
-
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
-
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
-
-
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
-
Müsste es nicht heissen : Gerade wenn über etwa alle Felder Gruppiert wird, gitbs eh kein brauchbares Ergebnis mehr ?Gerade wenn über etwa alle Felder Gruppiert wird, gitbs eh kein indexbasiertes Gruppieren 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,
goreGeändert von gorefest (09.03.10 um 13:52 Uhr)
-
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.---------------------------------------------------------------------------------------------------
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
-
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
Ähnliche Themen
-
LEFT JOIN mit COUNT-Funktion
Von sandroP im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 14.09.09, 17:54 -
Column count doesn't match value count at row 1
Von strolch_007 im Forum Relationale DatenbanksystemeAntworten: 4Letzter Beitrag: 09.03.09, 00:08 -
Count von Join-Einträgen
Von ev0lst im Forum Relationale DatenbanksystemeAntworten: 0Letzter Beitrag: 30.01.09, 22:15 -
Unterschied MySQL's COUNT und PHP's count
Von proux im Forum PHPAntworten: 5Letzter Beitrag: 21.02.05, 00:23 -
mit JOIN -> COUNT ähnliche Felder
Von Partymann im Forum Relationale DatenbanksystemeAntworten: 0Letzter Beitrag: 05.04.04, 09:46





Zitieren


Login






[PHP][Snippet] Array zu XML konvertieren