2 x COUNT in einer Abfrage

chris47803

Grünschnabel
Hallo,

ich möchte zu meiner vorhanden Abfrage
PHP:
$sql = "SELECT id, fahrer, COUNT(bemerkung) AS anzahl_unfaelle FROM tabelle WHERE bemerkung LIKE 'unfall' GROUP BY fahrer ORDER BY anzahl_unfaelle DESC LIMIT 50" ;

noch folgende Abfrage machen
PHP:
$sql = "SELECT id, fahrer, COUNT(fahrer) AS anzahl_rennen FROM tabelle  GROUP BY fahrer ORDER BY anzahl_rennen DESC LIMIT 50" ;

Alle Daten kommen aus einer Tabelle.

Habe schon mit UNION versucht, kapiere ich aber nicht, als Hobbyprogrammierer.

Danke, Chris
 
Du willst quasi aus den beiden Query-Strings einen machen?
Wie sieht denn deine Datenbankstruktur aus? Welche Tabellen spielen eine Rolle?
Und beschreib doch mal bitte mit Worten, was genau du abfragen möchtest.

Gruß
 
Okay, ich versuche mich mal im Raten:
Du hast eine Tabelle namens "tabelle" (was wirklich nicht besonders hilfreich ist) mit den Feldern id, fahrer und bemerkung. Steht in einer Zeile im Feld bemerkung das Wörtchen "unfall", dann hatte der betroffene Fahrer fahrer im Rennen id ... Moment, das funktioniert nicht.

Anders:
Du hast eine Tabelle namens "tabelle" (was wirklich (wirklich!) nicht besonders hilfreich ist) mit den Feldern id, fahrer und bemerkung. Jede Zeile steht für einen Unfall im Rennen mit der ID ... Moment, das klappt auch nicht. Irgendwas fehlt da. Aaach, ich weiß: die Logik!

Der Aufbau deiner Tabelle ist absolut unsinnig bezogen auf dein eigentliches Vorhaben. Wenn du es wirklich ordentlich machen willst (das Thema kann - glaube ich - auch in die Datenbank-Abteilung verschoben werden), dann brauchst du mehr als eine Tabelle. Beispiel:

Tabelle "fahrer"
Code:
id (INT)  |  vorname (VARCHAR(30))  |  nachname (VARCHAR(30))

Tabelle "saisons"
Code:
id (INT)  |  jahr (INT)

Tabelle "strecken"
Code:
id (INT)  |  bezeichnung (VARCHAR(30))

Tabelle "rennen"
Code:
id (INT)  |  saison_id (INT)  |  strecken_id (INT)

Tabelle "rennteilnahmen"
Code:
id (INT)  |  renn_id (INT)  |  fahrer_id (INT)

Tabelle "unfaelle"
Code:
id (INT)  |  rennteilnahme_id (INT)  |  bemerkung (TEXT)


Naja, okay. Vielleicht etwas zu aufgebläht. Aber da ginge noch mehr :D
Ich hoffe, die Primäschlüssel und Fremdschlüssel sind eindeutig zu erkennen.


Wenn du es ganz einfach haben willst, machst du folgendes:
Tabelle "fahrer":
Code:
id (INT)  |  fahrername (VARCHAR(60))  |  anzahl_rennen (INT)  |  anzahl_unfaelle (INT)

So oder so ähnlich.
 
Hallo,

ich weiß das meine Datenbanktabelle nicht der Normalform entspricht.
So ist für mich die Eingabe aber einfacher (bin nur Hobbyprogrammierer).

Datenbank-Aufbau

sortieren möchte ich nach Anzahl der Unfälle.

Gruß, Chris
 
müsste so eingendlich funktionieren:

SQL:
SELECT 
	fahrer, 
	SUM(CASE WHEN bemerkung LIKE 'unfall' THEN 1 ELSE 0 END) AS anzahl_unfaelle,
	COUNT(fahrer) AS anzahl_rennen
FROM tabelle 
GROUP BY fahrer 
ORDER BY anzahl_unfaelle DESC, anzahl_rennen DESC
LIMIT 50
 
Hallo Chris,
#1 du solltest dir auch als Hobbyprogrammierer die deutsche Wikipediaseite zu Datenbanknormalisierung ansehen, ... *kram, wo ist Sie den?* *ah, da* http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)#Dritte_Normalform_.283NF.29
Guck dir einfach nur mal den Unterschied von NF1 zu NF3 an, dann merkst du wo du optimieren kannst.
Zumal diese "einfache" Optimierung auch Geschwindigkeit in den Webprojekt bringt, warum 300.000 mal Hannover ausgeben(bzw. in der Datenbank speichern), wenn du es einmal in die Datenbank mit deiner ID schreiben kannst.

#2 mir ist aufgefallen das du im Link "mehrfach" Freizeichen nutzt und das so als Link sogar generierst. Das ist nicht umbedingt gut und bietet sogar angriffspunkte für SQL Injection. Da solltest du wirklich nochmal drüber arbeiten.
 
@ chibisuke

Vielen Dank, läuft super.
Da wäre ich nie drauf gekommen.


@ Sebastian Schmidt
Du hast vollkommen Recht.
Ich weiß ja auch, wie es gemacht wird, aber dann brauche ich auch ein Script um neue Eingaben zu machen.
Bisher nutze ich eine Excel-Tabelle, welche ich mit den neuen Daten fülle und nah MySQL importiere.

Gruß, Chris
 
Zurück