JOIN Select über mehr als 2 Spalten

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

  • JOIN Select über mehr als 2 Spalten

    Hallo erstmal,

    ..okay-> wieder so ein Thread zum leidigen Thema "Joins".

    Ich bin normalerweise im basteln recht kreativ, aber hier sehe ich den Wald vor lauter Bäumen nicht mehr. Ich hoffe, dass mir hier jemand zum Geistesblitz verhilft..

    Ich will aus 4 Tabellen Informationen holen. Mein Problem ist, dass die Tabellen nicht von mir stammen- nicht richtig normalisiert sind und ich schon nur für das Verständnis der Relationen recht lang gebraucht habe.. Da hat sich einer nicht viel Gedanken zur Übersichtlichkeit gemacht...

    Gegeben sind 4 Tabellen:

    (*R1-3) bezeichnet die Relationen

    |br_Kunden| ------ | br_Produkt | ------- | Kundenlogin |-------| cdr |
    c_id (*R1) -------- (*R1) ref_number ----- number (*R2)--- (*R2) c_number
    c_name ----------- p_account (*R3) ----- (*R3)pin ------------- cli_von
    ---------------------------------------------------------------- c_nach

    1) In br_Kunden sind Namen von Kunden sowie eine ID, welche in Beziehung mit der ref_number von br_Produkt steht.

    2) In cdr sind Daten dieser Kunden cli_von und cli_nach sind Telefonnummern von ->und nach- also Ziel, allerdings keine Namen.

    Ich möchte alle Daten der Tabelle cdr (für einen bestimmten Zeitraum, aber die Syntax hierfür in der where-Klausel ist mir klar...) mit der br_Kunden-Tabelle verknüpfen- also sehen, wer hier was von- oder nach vertelefoniert hat...

    Ich hab ein Brett vorm Kopf, weil ich es nicht hinbekomme.

    Folgendes ist mir eingefallen:

    SELECT t1.c_umber,t1.cli_von,t1.cli_nach,t2.c_name from cdr t1,br_Kunden t2 INNER JOIN Kundenlogin t3 on t1.c_number = t3.number
    INNER JOIN br_Produkt t4 on t4.ref_number = t2.c_id
    WHERE t1.calltime > '20040101000000' and t2.c_automatic_recharge_activation_status='not_used' LIMIT 0,1000;

    Es werden auch Daten ausgegeben- nur ist c_name immer der gleiche.

    Weiss hier jemand weiter?

    Gruss
    phpForX

  • #2
    Eigentlich müsste Dein Query ein karthesisches produkt erzeugen.
    der aufbau der query ist nicht logisch
    SELECT
    t1.c_umber,t1.cli_von,t1.cli_nach,t2.c_name
    from cdr t1, -- wo ist hier die verknüpfung????
    br_Kunden t2 INNER JOIN Kundenlogin t3 on t1.c_number = t3.number
    INNER JOIN br_Produkt t4 on t4.ref_number = t2.c_id
    WHERE
    t1.calltime > '20040101000000'
    and t2.c_automatic_recharge_activation_status='not_used'
    LIMIT 0,1000;
    Beantworte nie Threads mit mehr als 15 followups...
    Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

    Kommentar


    • #3
      ja, das ist es ja...
      Ich habe nach dem 'FROM halt eine weitere Tabelle bezeichnet- das ist auch zulässig-> nur scheint mir der Aufbau ebensowenig logisch.. das ist richtig.

      Eine bessere Idee?

      Wenn ich es ohne JOIN mache, scheint die Abfrage auch die gewünschten Ergebnisse zu erzeugen-> nur sehr langsam, da viele Datensätze enthalten sind.

      Das hier würde also ergebnistechnisch hinhauen:

      SELECT distinct t1.c_id,t1.c_name,t3.pin,t4.customernumber,t4.cli,t4.destination
      FROM br_costumers t1,br_products t2,customerlogin t3,cdr t4 where t4.customernumber = t3.number and
      t3.pin = t2.p_account and t2.p_ref_costumer_id = t1.c_id and
      t4.calltime > '20040101000000' and t1.c_automatic_recharge_activation_status='not_used'order by t4.customernumber LIMIT 0,1000

      Die Bezeichnungen sind diesmal echt-> im vorigen Thread habe ich um des Verständnisses wegen, die Bezeichner eingedeutscht.

      Hast du hier eine Idee?

      Gruss

      Kommentar


      • #4
        klar hab ich ne idee lies mal im manual nach und such mal nach karthesischen produkt...
        Beantworte nie Threads mit mehr als 15 followups...
        Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

        Kommentar


        • #5
          Original geschrieben von phpForX

          SELECT distinct t1.c_id,t1.c_name,t3.pin,t4.customernumber,t4.cli,t4.destination
          FROM br_costumers t1,br_products t2,customerlogin t3,cdr t4 where t4.customernumber = t3.number and
          t3.pin = t2.p_account and t2.p_ref_costumer_id = t1.c_id and
          t4.calltime > '20040101000000' and t1.c_automatic_recharge_activation_status='not_used'order by t4.customernumber LIMIT 0,1000
          Probiere mal:

          SELECT
          t1.c_id,t1.c_name,t3.pin,t4.customernumber,t4.cli,t4.destination
          FROM
          br_costumers t1 inner join br_products t2 on t2.p_ref_costumer_id = t1.c_id inner join
          customerlogin t3 on t3.pin = t2.p_account inner join
          cdr t4 on t4.customernumber = t3.number
          where
          t1.c_automatic_recharge_activation_status='not_used'
          order by t4.customernumber LIMIT 0,1000

          Kommentar


          • #6
            danke für deine Hilfe asp2php. Das funktioniert.
            Manchmal sieht man den Wald vor lauter Bäumen nicht....

            Gruss

            Kommentar

            Lädt...
            X