SQL Abfrage

ibu400

Neuer Benutzer
Beiträge
2
hier sind ja auch ein paar SQL Spezialisten. Bin leider totaler Anfänger und weiß nicht wen ich noch Fragen kann:

1. Tabelle fe_users hast folgende Spalten: uid, firma, name, email
2. Tabelle seriennummer hat folgende Spalten: uid, seriennummer, uid_typ, uid_fe_users
3. Tabelle seriennummer_typ hat folgende Spalten: uid, name

In Tabelle fe_users werden alle Userdaten gesammelt.
In Tabelle seriennummer werden die eigentlichen Seriennummer und die Verknüpfungen zu den Userdaten und Typ verknüpft.
In Tabelle seriennummer_typ werden die verschiedenen Typen gesammelt – z.B. Windows XP, Windows 7 usw.

Ich bräuchte jetzt eine Abfrage die mir ausgibt:

Firma / Name / E-Mail / Anzahl XP / Anzahl Windows 7 / Anzahl Windows 8

Komm da irgendwie nicht weiter. Was ich zumindest geschafft habe ist eine komplette Liste auszugeben – mit Seriennummer, Typ, Name, E-Mail usw.

PHP:
  $result = $db->query("
    SELECT
        fe_users.firma,
        fe_users.name,
        fe_users.email,
        seriennummer.uid_typ,
        seriennummer.seriennummer,
        seriennummer_typ.typ,   
    FROM seriennummer
    INNER JOIN fe_users
    ON seriennummer.uid_fe_user=fe_users.uid
    INNER JOIN seriennummer_typ
    ON seriennummer.uid_typ=seriennummer_typ.uid
    ");

ist das überhaupt möglich?

danke & grüße
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.423
hier sind ja auch ein paar SQL Spezialisten. Bin leider totaler Anfänger und weiß nicht wen ich noch Fragen kann:

1. Tabelle fe_users hast folgende Spalten: uid, firma, name, email
2. Tabelle seriennummer hat folgende Spalten: uid, seriennummer, uid_typ, uid_fe_users
3. Tabelle seriennummer_typ hat folgende Spalten: uid, name

In Tabelle fe_users werden alle Userdaten gesammelt.
In Tabelle seriennummer werden die eigentlichen Seriennummer und die Verknüpfungen zu den Userdaten und Typ verknüpft.
In Tabelle seriennummer_typ werden die verschiedenen Typen gesammelt – z.B. Windows XP, Windows 7 usw.

Ich bräuchte jetzt eine Abfrage die mir ausgibt:

Firma / Name / E-Mail / Anzahl XP / Anzahl Windows 7 / Anzahl Windows 8

Komm da irgendwie nicht weiter. Was ich zumindest geschafft habe ist eine komplette Liste auszugeben – mit Seriennummer, Typ, Name, E-Mail usw.

PHP:
  $result = $db->query("
    SELECT
        fe_users.firma,
        fe_users.name,
        fe_users.email,
        seriennummer.uid_typ,
        seriennummer.seriennummer,
        seriennummer_typ.typ,  
    FROM seriennummer
    INNER JOIN fe_users
    ON seriennummer.uid_fe_user=fe_users.uid
    INNER JOIN seriennummer_typ
    ON seriennummer.uid_typ=seriennummer_typ.uid
    ");

ist das überhaupt möglich?

danke & grüße


Jein.

Zuerst einmal der einfache Teil:

Code:
est=# create table fe_users(id int primary key, name text);
CREATE TABLE   
Time: 125,451 ms   
test=*# insert into fe_users values (1,'max');
INSERT 0 1   
Time: 0,397 ms   
test=*# insert into fe_users values (2,'hans');
INSERT 0 1   
Time: 0,245 ms   
test=*# insert into fe_users values (3,'otto');
INSERT 0 1   
Time: 0,256 ms   
test=*# create table seriennummer_typ(id int primary key, name text);
CREATE TABLE   
Time: 142,374 ms   
test=*# insert into seriennummer_typ values (1, 'windoof 7');
INSERT 0 1   
Time: 0,561 ms   
test=*# insert into seriennummer_typ values (2, 'windoof 8');
INSERT 0 1
Time: 0,211 ms
test=*# insert into seriennummer_typ values (3, 'mysql 3');
INSERT 0 1
Time: 0,202 ms
test=*# insert into seriennummer_typ values (4, 'postgresql 9.3');
INSERT 0 1
Time: 0,201 ms
test=*# create table sn (id int primary key, sn text, sn_typ int references seriennummer_typ, u_id int references fe_users);
CREATE TABLE
Time: 171,875 ms
test=*# insert into sn values (1, '123', 1, 1);
INSERT 0 1
Time: 38,629 ms
test=*# insert into sn values (2, '234', 1, 1);
INSERT 0 1
Time: 0,439 ms
test=*# insert into sn values (3, '345', 1, 1);
INSERT 0 1
Time: 0,398 ms
test=*# insert into sn values (4, '111', 2, 3);
INSERT 0 1
Time: 0,433 ms
test=*# insert into sn values (5, '222', 3, 2);
INSERT 0 1
Time: 0,385 ms
test=*# select u.name, t.name, count(1) from sn left join fe_users on (sn.u_id=u.id) left join seriennummer_typ t on (sn.sn_typ=t.id) group by u.name, t.name;
ERROR:  missing FROM-clause entry for table "u"
LINE 1: ..., count(1) from sn left join fe_users on (sn.u_id=u.id) left...
  ^
Time: 0,270 ms
test=*# select u.name, t.name, count(1) from sn left join fe_users u on (sn.u_id=u.id) left join seriennummer_typ t on (sn.sn_typ=t.id) group by u.name, t.name;
 name |  name  | count
------+-----------+-------
 otto | windoof 8 |  1
 hans | mysql 3  |  1
 max  | windoof 7 |  3
(3 rows)

Time: 20,783 ms

Du willst jetzt Zeilen zu Spalten machen. Das hab ich hier mal erklärt: https://www.pg-forum.de/viewtopic.php?f=66&t=4067

Ich glaub, hier hab ich das auch schon mal erklärt: https://www.datenbankforum.com/threads/zeilen-als-spalten-full-outer-join.1426/
 
Oben