phpbar.de logo

Mailinglisten-Archive

[php] AW: [php] SELECT ueber mehrere Tables

[php] AW: [php] SELECT ueber mehrere Tables

Kayssner.C_(at)_zdf.de Kayssner.C_(at)_zdf.de
Wed, 26 Jan 2000 12:53:44 +0100


Hallo Christiane,

>... einen einfachen SELECT ueber mehrere Tables mit gleicher Struktur
>... der alle Zeilen aller Tabellen einfach untereinander ausgibt.

Dein Problem gliedert sich in zwei Teile.

1.) Um die Ergebnissmengen von einzelnen Select's zu einer einzigen zu
    kombinieren, bietet die Sprache SQL (meines Wissens in SQL-92 be"-
    schrieben) ein bi"schen Mengenlehre. Dies sind f"ur

      ">Vereinigungen"< das Kommando   UNION (ALL)
      ">Schnittmengen"< das Kommando   INTERSECT
      ">Subtraktionen"< das Kommando   MINUS

    Dein Problem w"are somit mittels

      SELECT frucht FROM t1
      UNION
      SELECT frucht FROM t2
      UNION
      SELECT frucht FROM t3

    zu erledigen. 

    Zu allen ">Mengen"<-Operationen ist zu sagen, da"s sie nur  gehen,
    wenn die aufgef"uhrten Felder der zu mischenden Mengen  in  Anzahl
    und Typ "ubereinstimmen, sowie, da"s nur hinter dem letzten Select
    eine ORDER BY Clause stehen darf. Weiterhin gilt beim UNION,  be"-
    reits, im Gegensatz zum normalen Select, ein implizites  DISTINCT.
    M"ochte man mehrfach auftretende S"atze haben, so  ist  UNION  ALL
    einzusetzen.

2.) Ein weiteres Problem, kann  die  verwendete  Datenbank  sein.  Ein
    Hersteller ist nicht gezwungen, alle Features von SQL  zu  imple"-
    mentieren (dies trifft auch die ganz Gro"sen).  In  einer  anderen
    Mail war bereits davon die Rede, da"s MySQL es z.B. nicht  k"onnen
    soll. Dar"uber habe ich keine Information, aber es w"are m"oglich,
    denn in MySQL gehen ja auch keine SubSelects (bis auf EXISTS).


Ist MySQL ">politisch"< festgelegt  und  die  obige  Nichtverf"ugbar"-
keitsaussage zutreffend, w"urde ich, um trotzdem eine L"osung  vorzu"-
schlagen (nun leider etwas Aufwendig) folgende "Anderungen machen.

1.) Beseitigung der verschiedenen Tabellen bis auf eine.
2.) In diese ein zus"atzliches Feld aufnehmen; Name z.B.  'ACL'  (f"ur
    Access Control List) oder 'User' (f"ur eine  UserID)  oder  'Unix'
    (f"ur eine Unix " ahnliche  Sicherheit,  k"onnte  mit  der  RegExp
    Features in MySQL abgefragt werden)
3.) Ausdenken eines neuen Rechtesystems und
4.) Abfragen dann mit einem einfachen 

      SELECT frucht
        FROM fruechte
       WHERE ...
         AND acl IN [ 'Readable', ... ]
         ...

    oder

      ... 
        AND user = 'Hugo'
      ...

Ich hoffe ich konnte Dir helfen
Ciao,

Christian Kayssner  | e-mail: christian_(at)_kayssner.de
Els"asser Platz 9   | Tel.:   +49/611/48117
D-65195 Wiesbaden   | Fax.:   +49/611/9450244



php::bar PHP Wiki   -   Listenarchive