Abfrage über 5 Tables

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

  • Abfrage über 5 Tables

    Ich habe 5 Tabellen
    1. User:Index, Name
    2. Email:Index, Email
    3. Webpage:Index, Webpage
    4. UserWebpage:Index, Namensindex, Webpageindex
    5. UserEmail:Index, Namensindex, Emailindex

    Anmerkung: Jeder user hat eine Email, aber nicht jeder User eine Webpage

    Ich brauche
    alle Name, Email, Webpage-wenn vorhanden

    Mit meinen Kenntnissen ist es mir nicht möglich gewesen diese Daten in einer Abfrage zu extrahieren.

    Ich es überhaupt möglich oder muß ich zwei Abfragen starten und die Ergebnisse mit PHP mergen?
    Gruß
    Thomas Sebesta/Neunkirchen/Austria
    Entwicklergruppe dsfdb.org
    [color=blue](d)eutsche (s)peculativ (f)iction (d)aten(b)ank[/color]
    sourceforge.net/projects/dsfdb/

  • #2
    beispiele und erklärung:
    http://www.mysql.de/doc/de/JOIN.html

    sind zwar immer nur 2 tabellen, die erweiterung ist aber relativ einfach, mußt nur nach dem schama gehen und wissen, womit du welche tabellen verknüpfst!

    gruss

    Kommentar


    • #3
      Nur so als Frage:

      Verknüpfst du da n User mit n Emails und n Webpages und n... ?
      Oder warum hast du dafür 5 Tabellen?
      Denn wenn es zu jedem User nur eine Email, eine Webpage usw. gibt, wär das doch einfacher in einer einzigen Tabelle aufgehoben.
      if ($getraenk=="kein kaffee mehr da" && $verlangen=="gross") { $arbeitsmoral="im keller"; }

      Kommentar


      • #4
        Du spielst auf die Beziehungen der Tabellen an, oder?
        In seinem Fall ist es aber letztlich richtig, denn ein User kann:
        - mehrere E-Mail Adressen haben,
        - mehrere Webadressen usw.

        Dass man die 5 Tabellen evtl etwas zusammenschrumpfen könnte, ist sicher möglich, außerdem müß er die Tabellen wiederum auflösen und braucht daher wieder eine neu Tabelle um die Normalform zu erreichen. Bei Mysql ist das schon etwas schwieriger als bei den "normalen" DBs.

        Aber gut, wers meint soll die Übersicht verlieren (ist schnell passiert! Also vorher immer gut planen!!!)

        Kommentar


        • #5
          Original geschrieben von mrwhorf
          Nur so als Frage:
          Oder warum hast du dafür 5 Tabellen?
          Denn wenn es zu jedem User nur eine Email, eine Webpage usw. gibt, wär das doch einfacher in einer einzigen Tabelle aufgehoben.
          Die Tabellenstruktur ist stark vereinfacht und auf das Problem zugeschnitten. Es werden hunderte von email- und webadressen verwaltet und die user sind nur ein Teil der verschiedenen Verknüpfungen. Eine Vereinfachung wie oben würde an anderer Stelle (Replication) noch größere Probleme aufwerfen.

          Wie geschrieben: Ist die Abfrage in einem Stück möglich oder nicht - das wäre die Frage. Mein Wissen reicht (momentan) leider dazu nicht aus und mit probieren bin ich am Ende.
          Gruß
          Thomas Sebesta/Neunkirchen/Austria
          Entwicklergruppe dsfdb.org
          [color=blue](d)eutsche (s)peculativ (f)iction (d)aten(b)ank[/color]
          sourceforge.net/projects/dsfdb/

          Kommentar


          • #6
            Grundsätzlich kannst du Abfragen über mehrere Tabellen mit "Join" lösen (wie oben beschrieben). Ein Code-Beispiel ist schlecht zu liefern, da man deine DB nicht kennt. Es ist jedoch bei dir wahrscheinlich, um auf deine Frage zurück zukommen, dass du die Tabellen "mehrfach" abfragen mußt bzw. über eine oder zwei andere Tabellen/Abfragen auflösen mußt. Dies kannst du aber mit einem Modul lösen, welches du bei Bedarf immer wieder einsetzen kannst.
            Jenachdem welches Ergebnis du möchtest, kann es sein, dass es evtl. mit einer Anweisung geht. Ich würde mir jedoch überlegen, welche Anweisungen du im Normalfall benötigst und dann eine Funktion erstellen, die für alle Abfragen (oder die meisten) gültig ist und diese im Bedarfsfall einsetzen. Hierbei ist es dann egal, wie umfangreich das Modul wird, hauptsache es erfüllt in 95% aller Fälle seinen Dienst!

            Kommentar


            • #7
              Also danke an alle,
              Ich habs jetzt unendlich probiert mit einer Abfrage auszukommen - war (mir) einfach nicht möglich.

              Ich werde also auf ollib's Vorschlag mit der Funktion zurückkommen - ist vielleicht auch besser so.

              So long
              Gruß
              Thomas Sebesta/Neunkirchen/Austria
              Entwicklergruppe dsfdb.org
              [color=blue](d)eutsche (s)peculativ (f)iction (d)aten(b)ank[/color]
              sourceforge.net/projects/dsfdb/

              Kommentar


              • #8
                was du willst geht in einem select, les dir mal http://php-resource.de/forum/showthr...threadid=28292 durch
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  So leids mir tut, aber in einer select schaff' ich's nicht

                  Database-Struktur:
                  # EMS MySQL Manager 2.6.5.1
                  # ---------------------------------------
                  # Host : localhost
                  # Port : 3306
                  # Database : test


                  SET FOREIGN_KEY_CHECKS=0;

                  CREATE DATABASE `test`;

                  USE `test`;

                  #
                  # Structure for the `email` table :
                  #

                  CREATE TABLE `email` (
                  `email_id` int(4) NOT NULL auto_increment,
                  `email` char(50) default NULL,
                  PRIMARY KEY (`email_id`),
                  UNIQUE KEY `email_id` (`email_id`)
                  ) TYPE=MyISAM;

                  #
                  # Structure for the `name` table :
                  #

                  CREATE TABLE `name` (
                  `name_id` int(4) NOT NULL auto_increment,
                  `Name` varchar(50) default NULL,
                  PRIMARY KEY (`name_id`),
                  UNIQUE KEY `name_id` (`name_id`)
                  ) TYPE=MyISAM;

                  #
                  # Structure for the `nameemaillinks` table :
                  #

                  CREATE TABLE `nameemaillinks` (
                  `nel_id` int(4) NOT NULL auto_increment,
                  `name_id` int(11) default NULL,
                  `email_id` int(11) default NULL,
                  PRIMARY KEY (`nel_id`),
                  UNIQUE KEY `nel_id` (`nel_id`)
                  ) TYPE=MyISAM;

                  #
                  # Structure for the `namepagelinks` table :
                  #

                  CREATE TABLE `namepagelinks` (
                  `np_id` int(4) NOT NULL auto_increment,
                  `name_id` int(11) default NULL,
                  `page_id` int(11) default NULL,
                  PRIMARY KEY (`np_id`),
                  UNIQUE KEY `np_id` (`np_id`)
                  ) TYPE=MyISAM;

                  #
                  # Structure for the `page` table :
                  #

                  CREATE TABLE `page` (
                  `page_id` int(4) NOT NULL auto_increment,
                  `page` varchar(50) default NULL,
                  PRIMARY KEY (`page_id`),
                  UNIQUE KEY `page_id` (`page_id`)
                  ) TYPE=MyISAM;

                  #
                  # Data for the `email` table (LIMIT 0,500)
                  #

                  INSERT INTO `email` (`email_id`, `email`) VALUES
                  (1,'Gabi-Email'),
                  (2,'Kurt-Email'),
                  (3,'Anna-Email'),
                  (4,'Hans-Email'),
                  (5,'Werner-Email'),
                  (6,'Gabi-Email2');

                  #
                  # Data for the `name` table (LIMIT 0,500)
                  #

                  INSERT INTO `name` (`name_id`, `Name`) VALUES
                  (1,'Hans'),
                  (2,'Werner'),
                  (3,'Kurt'),
                  (4,'Anna'),
                  (5,'Gabi');

                  #
                  # Data for the `nameemaillinks` table (LIMIT 0,500)
                  #

                  INSERT INTO `nameemaillinks` (`nel_id`, `name_id`, `email_id`) VALUES
                  (1,1,4),
                  (2,2,5),
                  (3,3,2),
                  (4,4,3),
                  (5,5,1),
                  (6,5,6);

                  #
                  # Data for the `namepagelinks` table (LIMIT 0,500)
                  #

                  INSERT INTO `namepagelinks` (`np_id`, `name_id`, `page_id`) VALUES
                  (1,1,2),
                  (2,5,1),
                  (3,3,3);

                  #
                  # Data for the `page` table (LIMIT 0,500)
                  #

                  INSERT INTO `page` (`page_id`, `page`) VALUES
                  (1,'Gabi-Page'),
                  (2,'Hans-Page'),
                  (3,'Kurt-Page');
                  entweder bekomme ich alle Variationen aus Name, Page und Email oder ich bekomme nur jene, die Name, Page und Email haben. Die die keine Page besitzen scheinen dann nicht auf.
                  Wobei ja einige User mehrere Email-Adressen haben könnten.

                  Gewünschtes Ergebnis wäre:

                  Hans | Hans-Email | Hans-Page
                  Werner | Werner -Email | <NULL>
                  Kurt | Kurt-Email | Kurt-Page
                  Anna | Anna-Email | <NULL>
                  Gabi | Gabi-Email | Gabi-Page
                  Gabi | Gabi-Email2 | Gabi-Page

                  oder so, wenns geht?
                  Oder gehts nur wenn nur eine Email pro user zugelassen wird?

                  Offensichtlich kapier's ich nicht, oder es geht doch nicht
                  Zuletzt geändert von nekropole; 08.01.2004, 21:51.
                  Gruß
                  Thomas Sebesta/Neunkirchen/Austria
                  Entwicklergruppe dsfdb.org
                  [color=blue](d)eutsche (s)peculativ (f)iction (d)aten(b)ank[/color]
                  sourceforge.net/projects/dsfdb/

                  Kommentar


                  • #10
                    Code:
                     select * from Ich User a 
                    left outer join Email b on a.index=b.index
                    left outer join Webpage on a.Index=b.index
                    left outer join UserWebpage c on a.Index=c.index5
                    
                    etc. etc.
                    h.a.n.d.
                    Schmalle

                    http://impressed.by
                    http://blog.schmalenberger.it



                    Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
                    ... nur ohne :-)

                    Kommentar


                    • #11
                      Original geschrieben von schmalle
                      Code:
                       select * from Ich User a 
                      left outer join Email b on a.index=b.index
                      left outer join Webpage on a.Index=b.index
                      left outer join UserWebpage c on a.Index=c.index5
                      
                      etc. etc.
                      Das kann doch nicht funktionieren, da werden ja die jeweiligen indexe der Basis-tables mit denen der Link-Tabellen verglichen und die stellen bei den Linktabellen keine Verbindung dar.

                      Oder stehe ich einfach auf der Leitung. Bitte siehe obige korrigierte Struktur
                      Zuletzt geändert von nekropole; 08.01.2004, 22:24.
                      Gruß
                      Thomas Sebesta/Neunkirchen/Austria
                      Entwicklergruppe dsfdb.org
                      [color=blue](d)eutsche (s)peculativ (f)iction (d)aten(b)ank[/color]
                      sourceforge.net/projects/dsfdb/

                      Kommentar


                      • #12
                        probier mal
                        Code:
                        SELECT
                        	n.name, e.email, p.page
                        FROM
                        	name n
                        	LEFT JOIN nameemaillinks ne ON n.name_id=ne.name_id
                        		LEFT JOIN email e ON ne.email_id=e.email_id
                        	LEFT JOIN namepagelinks np ON n.name_id=np.page_id
                        		LEFT JOIN page p ON np.page_id=p.page_id
                        Ich denke, also bin ich. - Einige sind trotzdem...

                        Kommentar


                        • #13
                          Ein klein wenig vorbei, nämlich

                          Code:
                          SELECT 
                            n.Name,
                            e.email,
                            p.page
                          FROM
                            name n
                            LEFT OUTER JOIN nameemaillinks ne ON (n.name_id = ne.name_id)
                            LEFT OUTER JOIN email e ON (ne.email_id = e.email_id)
                            LEFT OUTER JOIN namepagelinks np ON (n.name_id = np.name_id)
                            LEFT OUTER JOIN page p ON (np.page_id = p.page_id)
                          Danke für eure Geduld, jetzt hab' ich's auch das Prinzip verstanden wie's geht.
                          Zuletzt geändert von nekropole; 09.01.2004, 20:14.
                          Gruß
                          Thomas Sebesta/Neunkirchen/Austria
                          Entwicklergruppe dsfdb.org
                          [color=blue](d)eutsche (s)peculativ (f)iction (d)aten(b)ank[/color]
                          sourceforge.net/projects/dsfdb/

                          Kommentar

                          Lädt...
                          X