Jojo55: Komplizierte Datenbankabfrage

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 :-)

  1. 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";

    1. 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 ?

      1. 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]