[SQL allgemein] SQL JOIN - mit Abfrage über mehrere Datenbanken!!

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [SQL allgemein] SQL JOIN - mit Abfrage über mehrere Datenbanken!!

    Hallo,
    ich bin neu hier und habe ein riesiges Problem ich habe mich total im Code verhäddert bzw. mich selbst glaube ich überschätzt hoffe das mir jemand helfen kann:

    MEIN PROBLEM:
    Ich habe die Dantenbanken stellenanzeigen, firmen, rubriken, kategorien, bundeslaender und anstellungsverhaeltnisse. Alle Datenbanken haben eine id, die auch in allen gleich heisst "id". Die Datenbank stellenanzeigen ist sozusagen die Masterdatenbank und hat die spalten id, firma, rubrik, kategorien, bundesland, anstellungsverhaeltniss und datum. Die anderen Datenbanken firmen, rubriken, bundeslaender und anstellungsverhaeltnisse haben jeweils eine id und dann meist nur noch eine weitere Spalte "name" mit dem Werten z.B. ort, kategorie, usw. In der Datenbank stellenanzeigen läuft alles zusammen z.B

    ***************************
    stellenanzeigen: ( fi=firma / ru=rubrik / bu=bundesland / an=anstellungsverhaeltniss )
    id-----fi-----ru-----bu-----an------ka-----datum
    1-----2------3------1------2-------1------2008-02-04
    2-----1------2------4------3-------2------2008-03-02
    3-----4------3------2------1-------3------2008-01-09
    ***************************
    firmen:
    id-----name
    1-----BMW
    2-----Henkel
    3-----Aldi
    4-----ePlus
    ***************************
    rubriken:
    id-----name
    1-----Programmierer gesucht für Projekt
    2-----Buchhaltung für Heimarbeit
    3-----Aussendienst mit starken Nerven
    4-----Innendienst mit netter Stimme
    ***************************
    kategorien:
    id-----name
    1-----Programmierung / IT
    2-----Buchhaltung / Steuern
    3-----Vertrieb / Verkauf
    4-----Inbound / Betreuung
    ***************************
    bundeslaender:
    id-----name
    1-----NRW
    2-----Berlin
    3-----Hessen
    4-----Hamburg
    ***************************
    anstellungsverhaeltnisse:
    id-----name
    1-----Vollzeit
    2-----Teilzeit
    3-----Praktikum
    4-----Freelancer


    Meine SQL-Abfrage sieht so aus:



    liefert jedoch kein Ergebnis.

    Wenn ich die SQL-Abfrage mit "*" mache geht alles, nur schmeisst das Script mir dann alle id's und namen durcheinander - ist ja klar kann sie nicht eindeutig zuordnen.


    PHP-Code:
    SELECT
         stellenanzeigen
    .id,
         
    firmen.name,
         
    rubriken.name,
         
    bundeslaender.name,
         
    stellenanzeigen.datum,
         
    stellenanzeigen.kategorien,
         
    kategorien.id,
         
    stellenanzeigen.bundeslaender,
         
    bundeslaender.id,
         
    stellenanzeigen.anstellungsverhaeltnisse,
         
    anstellungsverhaeltnisse.id
    FROM
         firmen
    ,rubriken,bundeslaenderkategorien,anstellungsverhaeltnissestellenanzeigen
    INNER JOIN kategorien ON stellenanzeigen
    .kategorien=kategorien.id 
    INNER JOIN bundeslaender ON stellenanzeigen
    .bundeslaender=bundeslaender.id
    INNER JOIN anstellungsverhaeltnisse ON stellenanzeigen
    .anstellungsverhaeltnisse=anstellungsverhaeltnisse.id 
    WHERE
         kategorien
    .id=AND 
         
    bundeslaender.id=16 AND 
         
    anstellungsverhaeltnisse.id=
    ORDER by stellenanzeigen
    .id 
    LIMIT 0 
    20 


    Sitze da schon Wochen dran an dem Problem, wäre wirklich super wenn jemand einen Rat oder Lösung hat.
    Gruss Chris
    Zuletzt geändert von chris1980; 25.02.2008, 20:15.

  • #2
    Hallo Chris
    Original geschrieben von chris1980
    liefert jedoch kein Ergebnis.
    ist natürlich keine Fehlerbeschreibung.
    Und viel unleserlicher kann man SQL-Abfragen wahrscheinlich nicht darstellen. Ein paar Leerzeichen oder Zeilenumbrüche kosten nicht so enorm viel Speicherplatz. Bitte brich ihn noch um, ein zweites mal scrolle ich im gleichen Beitreg nicht horizontal. Hier kannst du nachlesen, wie solche Abfragen vernünftig formatiert werden können.
    Aus dieser Unleserlichkeit hast du wahrscheinlich auch den Überblick verloren. Da hast du ausser zu rubriken zu allen andern Tabellen mindestens zwei, zu bundeslaender sogar drei, teilweise unbedingte JOINS. Das gäbe bei je 10 Einträgen allein 100'000 Zeilen. Dazu kommen dann noch die expliziten JOINS. Tabellen, die du explizit mit JOIN einbindest, sollst du nicht zusätzlich noch in der FROM-Klausel einbinden. In deinem Fall könnte dann dei Abfrage etwa so aussehen:
    PHP-Code:
    SELECT     
        s
    .id,
        
    s.datum,
        
    s.kategorien,
        
    s.bundeslaender,
        
    s.anstellungsverhaeltnisse,
        
    f.name,        
        
    r.name,
        
    b.name,
        
    b.id,
        
    k.id,
        
    a.id 
    FROM 
        stellenanzeigen 
    AS s
    INNER JOIN 
        kategorien 
    AS k ON s.kategorien k.id 
    INNER JOIN 
        bundeslaender 
    AS b ON s.bundeslaender b.id 
    INNER JOIN 
        firmen 
    AS f b ON s.firma f.id 
    INNER JOIN 
        anstellungsverhaeltnisse 
    AS a ON s.anstellungsverhaeltnisse a.id 
    INNER JOIN 
        rubriken 
    AS r b ON s.rubriken r.id 
    WHERE 
        k
    .id 
      
    AND 
          
    b.id 16 
      
    AND 
          
    a.id 
    ORDER BY 
        s
    .id 
    LIMIT 20 
    Da ich schreibfaul bin, benutze ich Aliases, was nach meiner Meinung die Leserlichkeit ebenfalls erhöht. Ausserdem Frage ich mich, wozu du die vielen Id's überhaupt brauchst, aber das hat mit dem Problem nichts zu tun.
    Gruss
    H2O

    Kommentar


    • #3
      ja das grad hatt NULL mit dem Problem zu tun!

      also wenn du mehrer Datenbanken verbinden willst musst Du quasi die datenbank und den benutzernamen davor schreiben!
      frag mich nicht, wieso nur die datenbank nicht langt.
      ich weiß leider nicht mehr genau, ob zuerst datenbank oder username, da in meiner abfrage datenbankname mit dem user gleich ist :-D quasi z.B so:

      intranet.intranet.table1.id = 55

      intranet = user und datenbank
      table1 = Tabelle
      id = Feld

      vergiss also die ganzen prefixe nicht!

      greetz Flip

      Edit: wenn du in einer datenbank arbeitest, musst du nur die prefixe für die externen datenbanken angeben, aber falsch ist es nicht, wenn man die aktuelle auch angibt!
      Zuletzt geändert von Flip7; 25.02.2008, 15:53.
      Find Parties?
      Partysuche

      Kommentar


      • #4
        H2O Vielen Vielen Dank. Jetzt Klappt das Script. Man man hat mich das lange aufgehalten, danke.

        Muss dir Recht geben "Ordnung ist das halbe Leben"
        Jetzt versteh ich den Code auch viel besser und das arbeiten darin fällt viel leichter.
        Ehrlich gesagt konnte ich mein Script jetzt halbieren.
        Werde wohl mein ganzes Projekt jetzt nochmal überarbeiten.......

        Kommentar


        • #5
          Original geschrieben von Flip7
          ja das grad hatt NULL mit dem Problem zu tun!
          also wenn du mehrer Datenbanken verbinden willst ...
          Theoretisch hast du natürlich recht. Nur weiss Chris1980 gar nicht, was eine Datenbank ist. Deshalb bezeichnet er jede Tabelle als solche. Ist eigentlich aus seinem Code klar ersichtlich.
          Gruss
          H2O

          Kommentar


          • #6
            achso Tabellen meint er :-D

            also chris1980 pass auf:

            Ein Datenbankserver besitzt Datenbanken.
            Eine Datenbank besitzt Tabellen.
            In den Tabellen erst stehen die Daten, nicht direkt in einer Datenbank!

            Wenn du in einer Datenbank mit Tabellen arbeitest brauchst du i.d.R keine Prefixe, außer du nennst alle Primären Schlüssel z.B id siehe

            Code:
            Select * FROM x INNER JOIN y ON(id = id)

            theoretisch könnte man das verarbeiten, weil wir sowieso nur 2 tabellen verknüpfen, aber mysql will hier:

            Code:
            Select * FROM x INNER JOIN y ON(y.id = x.id)
            sobald etwas zweideutig wird oder über mehrere DATENBANKEN, ich wiederhole DATENBANKEN :-D geht musst du prefixe nehmen!

            greetz Flip
            Find Parties?
            Partysuche

            Kommentar

            Lädt...
            X