Alte mysql_query() Abfrage auf pdo "Upgraden" & verbessern

Rootbob91

Aktiver Benutzer
Beiträge
27
Huhu, ich bin gerade auf ein altes Projekt gestoßen und versuche die Abfragen n bissl zu verbessern.

Habe hier Folgende:
PHP:
$qry = mysql_query("SELECT id,firma FROM kunden");
$reihen = array();
while ($kd = mysql_fetch_array($qry)) {
$subqry = mysql_query("SELECT COUNT(*) FROM auftraege WHERE kundennr=$kd[0]");
$reihen[] = "['" . $kd[1] . "'," . mysql_result($subqry, 0) . "]";
}
$datastring = implode(",", $reihen);
Den datastring brauche ich für ne API.

Jetzt versuche ich das ganze auf PDO zu upgraden & zusätzlich zu verbessern. Es gab doch so sum() Befehl, kann man den nicht hier verwenden, um diese Subquery zu überspringen?

Natürlich erstmal ne neue PDO Instanz erstellen:
PHP:
$db = new PDO('mysql:host=derHost;dbname=dieDB;charset=utf8', 'derBenutzer', 'dasPW');

Dann die Query vorbereiten:
PHP:
 $sq = $db->prepare("SELECT COUNT(*) FROM auftraege WHERE kundennr=?");
if ($sq->execute(array($kdid))) {
$oAU = $sq->fetch(PDO::FETCH_OBJ);
}

Hab hier aber Schwierigkeiten das unter einem Hut zu kriegen, mag vlt. daran liegen das ich gerade nicht ganz bei der Sache bin, gestrige Nacht war ein bisschen schlaflos :p..

Also zusammengefasst, soll das Script auslesen welche Firma (Kunde) wie viele Aufträge bei uns hat und dies wie folgt ins reihen-Array packen:
['Firma', AnzahlAufträge]
 
Werbung:
Danke erstmal für deine Antwort, also die Tabellen sehen so aus:

Tabelle: auftraege
Spalten:
- nr (int, auto increment, unique)
- kundennr
- .....

Tabelle: kunden
Spalten:
- id (int, auto increment, unique)
- firma (text, da kommt der firmenname rein)
- .....
 
Hab mir das Beispiel hier angeguckt, aber da steht ja auch direkt ne Anzahl innerhalb der Tabelle. Sprich man weiß in der einen Tabelle, wie viele Produkte von einer Art vorhanden sind, dass weiß ich in meinem Fall innerhalb der Tabelle ja nicht, sondern erstmal nur durch die Abfrage "SELECT COUNT (*) FROM auftraege WHERE kundennr=X"
 
Habs glaube ich hinbekommen:
SELECT firma,(SELECT COUNT (*) FROM auftraege WHERE kundennr = kunden.id) as 'anzauftraege' FROM kunden
 
... und noch ein andere Weg mit einem Query und bekommt direkt das Ergebnis:

Code:
SELECT GROUP_CONCAT(r.row SEPARATOR ',') AS result
FROM (
  SELECT CONCAT( '[\'', k.firma, '\',', sum(1), ']') ROW
  FROM kunden k
  LEFT JOIN auftraege a ON k.id = a.kundennummer
  GROUP BY k.id
) r;

Code:
mysql> SELECT GROUP_CONCAT(r.row SEPARATOR ',') AS result
    -> FROM (
    ->   SELECT CONCAT( '[\'', k.firma, '\',', sum(1), ']') ROW
    ->   FROM kunden k
    ->   LEFT JOIN auftraege a ON k.id = a.kundennummer
    ->   GROUP BY k.id
    -> ) r;
+----------------------------------------------------------------------+
| result                                                               |
+----------------------------------------------------------------------+
| ['Müller',4],['Meier',2],['Schmitz',1],['Zimmermann',1],['Busch',2]  |
+----------------------------------------------------------------------+
1 row in set (0,00 sec)

mysql>

Code:
mysql> select * from kunden;
+----+------------+---------------+
| id | firma  | noch_ein_feld |
+----+------------+---------------+
|  1 | Müller  |  1 |
|  2 | Meier  |  22 |
|  3 | Schmitz  |  33 |
|  4 | Zimmermann |  44 |
|  5 | Busch  |  5 |
|  6 | NULL  |  NULL |
+----+------------+---------------+
6 rows in set (0,00 sec)

mysql> select * from auftraege;
+----+--------------+--------------+
| id | kundennummer | auftragswert |
+----+--------------+--------------+
|  1 |  1 |  99 |
|  2 |  1 |  33 |
|  3 |  1 |  22.2 |
|  4 |  2 |  1.23 |
|  5 |  2 |  9.99 |
|  6 |  1 |  17.88 |
|  7 |  3 |  1 |
|  8 |  4 |  44.55 |
|  9 |  5 |  5 |
| 10 |  5 |  12.13 |
+----+--------------+--------------+
10 rows in set (0,00 sec)

mysql>

Gruss

Bernd
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
Zurück
Oben