Komplizierte Datenbankabfrage
Jojo55
- datenbank
Hallo zusammen.
Ich versuche schon seit einiger Zeit aus meiner MySQL-Datenbank (v.4.0.24) ganz bestimmte Daten herauszuholen.
Hier erst mal die Tabellen:
[code=SQL]
data_unit Tabelle:
+----+---------+-----------+
| ID | type_id | name |
+----+---------+-----------+
| 1 | 100 | Spion 1 |
| 2 | 103 | Kl. Tr. 1 |
| 3 | 200 | Spion 2 |
| 4 | 203 | Kl. Tr. 2 |
+----+---------+-----------+
unit Tabelle:
+----+---------+---------+---------+-------+
| ID | type_id | base_id | army_id | speed |
+----+---------+---------+---------+-------+
| 1 | 100 | 3 | NULL | 87 |
| 2 | 100 | 3 | NULL | 90 |
| 3 | 103 | 3 | NULL | 50 |
| 4 | 200 | 3 | NULL | 103 |
| 5 | 200 | 5 | NULL | 100 |
| 6 | 100 | NULL | 5 | 85 |
| 7 | 103 | NULL | 5 | 83 |
| 8 | 203 | 5 | NULL | 50 |
+----+---------+---------+---------+-------+
[/code]
So... das waren jetzt erst mal die Tabellen.
Nun zum eigentlichen Problem:
Ich möchte nun alle Zeilen aus der data_unit Tabelle holen, wo die type_id in der unit Tabelle vorkommt. Außerdem muss die base_id = 3 sein und die army_id = NULL. Hinzu kommt noch, dass ich den kleinsten Speed aus der unit Tabelle haben will, der diese type_id hat.
Klingt wohl sehr kompliziert.
Das Ergebnis sollte dann ungefair so aussehen:
[code=SQL]
+---------+-----------+---------+
| type_id | name | speed |
+---------+-----------+---------+
| 100 | Spion 1 | 87 |
| 103 | Kl. Tr. 1 | 50 |
| 200 | Spion 2 | 103 |
+---------+-----------+---------+
[/code]
Ich hoffe das kann man irgendwie in einen einzigen SQL-Call reinpacken, aber ich habe schon alles mir bekannte bezüglich JOINS etc. ausprobiert und bin mit meinem Latein am Ende.
Vielleicht könnt ihr mir da helfen :-)
echo $begrüßung;
Ich möchte nun alle Zeilen aus der data_unit Tabelle holen,
Das wäre so:
SELECT data\_unit
.*
FROM data\_unit
Das Ergebnis sollte dann ungefair so aussehen:
| type_id | name | speed |
kleine Plan-Änderung:
SELECT data\_unit
.type\_id
, data\_unit
.name
, unit
.speed
FROM data\_unit
, unit
wo die type_id in der unit Tabelle vorkommt.
Eine Bedingung kommt hinzu: WHERE data\_unit
.type\_id
= unit
.type\_id
Außerdem muss die base_id = 3 sein
AND unit
.base\_id
=3
und die army_id = NULL.
AND unit
.army\_id
IS NULL
Hinzu kommt noch, dass ich den kleinsten Speed aus der unit Tabelle haben will, der diese type_id hat.
Dazu wird aus unit
.speed
in der SELECT-Klausel ein: MIN( unit
.speed
)
und eine Gruppierung kommt hinzu: GROUP BY type\_id
, name
Das ergibt dann:
SELECT `data_unit`.`type_id` , `data_unit`.`name` , MIN( `unit`.`speed` )
FROM `data_unit` , `unit`
WHERE `data_unit`.`type_id` = `unit`.`type_id`
AND `unit`.`base_id` =3
AND `unit`.`army_id` IS NULL
GROUP BY `type_id` , `name`
Klingt wohl sehr kompliziert.
Ach nö, es gibt schlimmeres.
echo "$verabschiedung $name";
Perfekt funktioniert ! Danke !!!
Ich hab aber leider was vergessen :-/
Zusätzlich bräuchte ich noch alle die Anzahl der Vorhanden Zeilen aus "unit" die der type_id aus "data_unit" Tabelle entsprechen.
Also sodass das Ergebnis schlussendlich wie folg aussieht:
[code=SQL]
+---------+-----------+---------+--------+
| type_id | name | speed | Anzahl |
+---------+-----------+---------+--------+
| 100 | Spion 1 | 87 | 2 |
| 103 | Kl. Tr. 1 | 50 | 1 |
| 200 | Spion 2 | 103 | 1 |
+---------+-----------+---------+--------+
[/code]
Das könnte dann glaub ich dann doch schwierig werden oder ?
OH...
Sorry
Ich hab das Problem schön gelöst ;)
Also das Resultat meines Problems ist dieser SQL-Call:
[code=SQL]
SELECT data\_units
.unit\_id
, data\_units
.name
, MIN( units
.speed
), COUNT(units
.speed
)
FROM data\_units
, units
WHERE data\_units
.unit\_id
= units
.type\_id
AND units
.base\_id
=3
AND units
.army\_id
IS NULL
GROUP BY type\_id
, name
[/code]