Tabellen verknüpfen, JOIN-Problem

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

  • Tabellen verknüpfen, JOIN-Problem

    Hallo allerseits!

    Ich hoffe, hier im richtigen Forum zu posten und mich als Anfänger einigermassen verständlich auszudrücken!

    Ich habe ein Problem mit einer Abfrage, welche sich wohl nur durch Verwendung von JOINS lösen lässt:

    Abfrage:
    -----------

    $abfrage = "SELECT * FROM cs_members, cs_members_kat, cs_members_job WHERE (cs_members.kat = cs_members_kat.kat_id AND cs_members.job = cs_members_job.job_id) ORDER BY nick AND kat ASC";
    -----------

    Zur Erklärung:
    Ich habe eine Mitgliederverwaltung, in welcher ich die Mitglieder auch in Kategorien einteilen/ausgeben kann und jedes Mitglied eine Aufgabe zugewiesen bekommt.
    Nun bekomme ich mit der o.g. Abfrage auch alles so wie es unter normalen Umständen sein soll, wenn man nun aber bei einem Mitglied vergisst, eine Kategorie/Aufgabe zuzuordnen, erscheint dieses Mitglied nirgends und liegt als Datenbankleiche rum, d.h. muss manuell über mySQL gelöscht/bearbeitet werden.
    Wie muss ich diese Abfrage also ändern oder ggf. mit JOINS ausstatten, damit auch die unzugeordneten (in der DB mit Standard=Null) Mitglieder in der Ausgabetabelle erscheinen?
    Die Kategorie/Aufgabe wird als ID in der cs_members abgelegt udn dann durch die Abfrage aus den anderen beiden Tabellen wieder in den Klartext umgewandelt.

    Die Suche habe ich benutzt und auch schon viele Ansätze gefunden, aber wie ich es auch mache, die Ausgabe funktioniert nicht!
    Im übrigen mein erster Beitrag hier, obwohl ich schon seit einigen Monaten regelmäßig hier lese und schon einige Probleme gelöst bekam! Ein Dank hier an die Profis!

    Danke und Gruss...Michael[B]

    Nachtrag: Habe die Abfrage absichtlich nicht in PHP-Tags geschrieben, damit man nicht hin- und herscrollen muss, hoffe das war richtig so, bei nur einer Zeile PHP-Code.
    Zuletzt geändert von MikeOverDSL; 24.07.2004, 12:20.

  • #2
    probiere mal:
    PHP-Code:
    $abfrage "select * from cs_members a left join cs_members_kat b
                 on a.kat=b.kat_id
                 left join cs_members_job c 
                 on a.job=c.job_id
                 order by a.nick, a.kat"

    Kommentar


    • #3
      Ne, hab zwar wieder was dazugelernt, aber das Ergebnis ist nun genau das selbe. Es werden nach wie vor nur die zugeordneten (job und kat) Mitglieder ausgegeben.

      Irgendwo sollte die Abfrage noch die Mitglieder auslesen bei denen kat=0 OR job=0, das sind dann die unzugeordneten. Wenn ich das jedoch einfüge, dann spuckt er mir jeden Fall aus, also verbindet alle möglichen Kategorien mit allen möglichen Aufgaben!

      Ein untauglicher Versuch von mir war:

      PHP-Code:
      $abfrage "select * from cs_members a left join cs_members_kat b
                       on (a.kat=b.kat_id OR a.kat=0)
                       left join cs_members_job c 
                       on (a.job=c.job_id OR a.job=0)
                       order by nick AND kat ASC"

      Die Null-Möglichkeit wird aber ignoriert!
      Zuletzt geändert von MikeOverDSL; 24.07.2004, 12:36.

      Kommentar


      • #4
        hast du die Abfrage 1:1 kopiert oder auch selbst modifiziert? wenn selbst modifiziert, dann bitte posten, denn die Abfrage funz genauso wie du es haben möchtest.

        EDIT:
        ich ging davon aus, dass cs_members die Tabelle ist die alle Infos enthält. Sonst ersetze "left join" durch "right join" dann erhältst du alle Datenzeilen in den beiden anderen Tabellen.
        Zuletzt geändert von asp2php; 24.07.2004, 12:45.

        Kommentar


        • #5
          Die Tabelle cs_members enthält auch alle Informationen, u.a. wird dort für die Spalten job und kat eine ID gesetzt, welche wiederum durch das Verknüpfen mit den Tabellen cs_mebers_job und cs_members_kat in Klartext umgewandelt wird.

          z.B.:

          cs_members:

          mem_id = 1
          kat = 1
          job = 2

          cs_members_kat

          kat_id = 1; title = Mitglieder

          Aus der cs_members wird also kat ausgelesen und über cs_members_kat dem Titel "Mitglieder" zugewiesen.
          Dies muß so sein, weil ich die Aufgaben und Kategorien über ein Formular in cs_members_kat und cs_members_job eingebe , um dann beim Neuanlegen von Mitgliedern diese in ein Dropdown-Menü zu setzen.
          (Nun wirds kompliziert mit erklären...)
          Zuletzt geändert von MikeOverDSL; 24.07.2004, 12:57.

          Kommentar


          • #6
            ich bin mir sicher dass meine Abfrage funz. Zum Test sollst du mal weniger Daten selectieren, um die Übersicht nicht zu verlieren, etwa so:
            PHP-Code:
            $abfrage "select a.mem_id, a.kat, a.job, b.kat_id, c.job_id 
                         from cs_members a left join cs_members_kat b
                         on a.kat=b.kat_id
                         left join cs_members_job c 
                         on a.job=c.job_id
                         order by a.nick, a.kat limit 100"

            btw: mal sprichst du von 0 dann wiederum Null, also Merke:

            NULL <> 0 <>''

            Kommentar


            • #7
              Neuer Erklärungsversuch:

              Meine Mitgliederverwaltung setzt sich aus drei Formularen zusammen:

              1. Ein Formular zur Erstellung von Kategorien; Daten (kat_id; title, description) werden in cs_members_kat gespeichert.

              2. Ein Formular zur Erstellung von Aufgaben; Daten (job_id, title) werden in cs_members_job gespeichert.

              3. Ein Formular zur Eingabe von Mitgliedern; Daten (mem_id;...; job; kat;...uvm...) werden in cs_members gespeichert.

              Die Aufgaben und Kategorien in diesem Formular werden aus den ersten beiden bzw. deren Tabellen ausgelesen und in einem Dropdown-Menü zur Auswahl gestellt.
              Ausgewählt bei den Dropdown-Menüs ist ein Leerfeld, welches im Falle der Speicherung als 0 in die Spalte eingetragen wird. Unter dem leerfeld werden dann die Werte der Spalten "title" ausgegeben.
              Es gibt also ein Dropdownmenü zur Auswahl der Kategorie, welche die Kategorie innerhalb cs_members als Nummer speichert. Die Nummer wiederum ist gleichzeitig die kat_id aus der Tabelle des ersten Formulars.
              Analog das mit den Aufgaben.

              Somit wird bei der Ausgabe als Tabelle:

              Mitglied | Kategorie | Aufgabe | usw...
              ----------|--------------|------------|----------

              die Kategorie und die Aufgabe, welche in cs_members nur als Zahl vorliegen, durch das Verbinden mit cs_members_kat und cs_members_job als Text (title) ausgegeben, da ja die Zahlen aus cs_members den ID's aus cs_members_kat bzw. cs_members_job entsprechen.

              Puh, erklären ist wirklich sehr schwierig...
              BTW: Ich habe insgesamt erst 7 Datensätze in cs_members.

              Das Ergebnis sieht im übrigen so aus:
              http://www.senility.de/Clanscript/members/index.php
              Zuletzt geändert von MikeOverDSL; 24.07.2004, 14:29.

              Kommentar


              • #8
                poste mal bitte einen tabellen-dump ... also, alle befehle, um die tabelle zu erstellen und zu füllen ....

                wenn du zb. einem mitglied mehrere aufgaben zuweisen willst, wie willst du das machen?
                Die Zeit hat ihre Kinder längst gefressen

                Kommentar


                • #9
                  #
                  # Tabellenstruktur für Tabelle `cs_members`
                  #

                  CREATE TABLE `cs_members` (
                  `mem_id` int(5) unsigned zerofill NOT NULL auto_increment,
                  `nick` varchar(30) NOT NULL default '',
                  `steamid` varchar(25) NOT NULL default '',
                  `hlsw` varchar(10) NOT NULL default '',
                  `firstname` varchar(20) NOT NULL default '',
                  `birth_d` char(2) NOT NULL default '',
                  `birth_m` varchar(10) NOT NULL default '',
                  `birth_y` varchar(4) NOT NULL default '',
                  `postal` varchar(5) NOT NULL default '',
                  `city` varchar(25) NOT NULL default '',
                  `email` varchar(35) NOT NULL default '',
                  `icq` varchar(15) NOT NULL default '',
                  `homepage` varchar(40) NOT NULL default '',
                  `regdate` varchar(10) NOT NULL default '',
                  `job` varchar(40) NOT NULL default '0',
                  `status` char(1) NOT NULL default '',
                  `kat` varchar(30) NOT NULL default '0',
                  `other` varchar(50) NOT NULL default '',
                  `picture` varchar(60) NOT NULL default '',
                  `internet` text NOT NULL,
                  `cpu` varchar(30) NOT NULL default '',
                  `ram` varchar(30) NOT NULL default '',
                  `pc_other` text NOT NULL,
                  `map` text NOT NULL,
                  `weapon` text NOT NULL,
                  `name` varchar(30) NOT NULL default '',
                  `street` varchar(40) NOT NULL default '',
                  `tel` varchar(20) NOT NULL default '',
                  `handy` varchar(20) NOT NULL default '',
                  `alt_email` varchar(40) NOT NULL default '',
                  `motto` text NOT NULL,
                  `pw` varchar(10) NOT NULL default '',
                  `************` char(1) NOT NULL default '',
                  PRIMARY KEY (`mem_id`)
                  ) TYPE=MyISAM;
                  # --------------------------------------------------------

                  #
                  # Tabellenstruktur für Tabelle `cs_members_job`
                  #

                  DROP TABLE IF EXISTS `cs_members_job`;
                  CREATE TABLE `cs_members_job` (
                  `job_id` tinyint(5) unsigned zerofill NOT NULL auto_increment,
                  `job_title` text NOT NULL,
                  `description` text NOT NULL,
                  PRIMARY KEY (`job_id`)
                  ) TYPE=MyISAM;
                  # --------------------------------------------------------

                  #
                  # Tabellenstruktur für Tabelle `cs_members_kat`
                  #

                  DROP TABLE IF EXISTS `cs_members_kat`;
                  CREATE TABLE `cs_members_kat` (
                  `kat_id` tinyint(5) unsigned zerofill NOT NULL auto_increment,
                  `title` varchar(25) NOT NULL default '',
                  `sort` int(3) NOT NULL default '0',
                  `description` text NOT NULL,
                  PRIMARY KEY (`kat_id`)
                  ) TYPE=MyISAM;

                  Kommentar


                  • #10
                    hmm,

                    den inhalt darf ich mir selbst ausdenken?
                    Code:
                    SELECT
                      mem_id,
                      job_title,
                      title kat_title
                    FROM
                      cs_members m
                    JOIN
                      cs_members_job j
                    ON
                      m.job = j.job_id
                    JOIN
                      cs_members_kat k
                    ON
                      m.kat = k.kat_id
                    
                    UNION
                    
                    SELECT
                      mem_id,
                      IFNULL (job_title, "ohne job"),
                      IFNULL (title, "ohne kategorie") kat_title
                    FROM
                      cs_members m
                    LEFT JOIN
                      cs_members_job j
                    ON
                      m.job = j.job_id
                    LEFT JOIN
                      cs_members_kat k
                    ON
                      m.kat = k.kat_id
                    WHERE
                      m.kat=0
                    OR
                      m.job=0
                    funktioniert bei mir ^^

                    wenn du kein UNION benutzen kannst, muß du wohl zwei queries machen
                    Die Zeit hat ihre Kinder längst gefressen

                    Kommentar

                    Lädt...
                    X