Mehrere Tabellen abfragen mysql5

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

  • Mehrere Tabellen abfragen mysql5

    Ich häng grad an ner sql abfrage und komm einfach nicht weiter.
    Hoffentlich ist das einigermaßen verständlich erklärt von mir.
    Es sind 2 Tabellen, aus denen daten ausgelesen werden sollen um die in eine XML-Datei auszugeben.

    Die erste Tabelle enthält Metadaten zu Artikeln (erstellungsdatum, autor usw.) und die Überschrift und den ersten Artikeltext.
    Dann gibt es eine 2. Tabelle in der Subartikel stehen. Die Tabelle enthält die gleichen Spalten + die Referenz auf den Hauptartikel.

    Wie bring ich es nun hin, das mir zum Hauptartikel die jeweiligen Unterartikel ausgegeben (die Zeile aus dem Hauptartikel also 1x und Unterartikel nx)

    Left Join, Right Join hat mir bisher immer nur zum gleichen Resultat geführt und ich bin jetzt nicht sicher ob das ein Fehler beim Aufbau der DB ist?

    Ist-Zustand:

    Hauptartikel - Unterartikel
    Hauptartikel - Unterartikel
    Hauptartikel - Unterartikel

    Soll Zustand:

    Hauptartikel - Unterartikel
    Unterartikel
    Unterartikel

    Hier die Abfrage dazu
    PHP-Code:
    SELECT a.header AS mainheader
           
    a.text AS maintext,
           
    a.creation_date AS crdate,
           
    a.author AS author,
           
    a.last_updated AS lastupdate,
           
    b.header AS subheader 

    FROM articles 
    AS a,
    subarticles AS b

    WHERE date
    (a.date) >= '$newStartDate' 
    AND date(a.date) <= '$newEndDate'
    AND a.id b.reference
    ORDER BY a
    .idb.path 
    Hier der Tabellenaufbau

    Code:
    
    CREATE TABLE `articles` (
      `id` mediumint(8) unsigned NOT NULL auto_increment,
      `path` varchar(255) collate utf8_unicode_ci NOT NULL default '',
      `creation_date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
      `date` datetime NOT NULL default '0000-00-00 00:00:00',
      `thema_type` varchar(255) collate utf8_unicode_ci NOT NULL default '',
      `header` varchar(255) collate utf8_unicode_ci NOT NULL default '',
      `text` text collate utf8_unicode_ci NOT NULL,
      `author` varchar(255) collate utf8_unicode_ci NOT NULL default '',
      `last_updated` timestamp NOT NULL default '0000-00-00 00:00:00',
      `comment` varchar(255) collate utf8_unicode_ci default NULL,
      PRIMARY KEY  (`id`),
      UNIQUE KEY `path` (`path`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=13 ;
    
    
    
    CREATE TABLE `subarticles` (
      `id` mediumint(8) unsigned NOT NULL auto_increment,
      `reference` mediumint(8) unsigned NOT NULL default '0',
      `path` varchar(255) collate utf8_unicode_ci NOT NULL default '',
      `creation_date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
      `date` timestamp NOT NULL default '0000-00-00 00:00:00',
      `thema_type` varchar(255) collate utf8_unicode_ci NOT NULL default '',
      `header` varchar(255) collate utf8_unicode_ci NOT NULL default '',
      `text` text collate utf8_unicode_ci NOT NULL,
      `last_updated` timestamp NOT NULL default '0000-00-00 00:00:00',
      `comment` varchar(255) collate utf8_unicode_ci default NULL,
      PRIMARY KEY  (`id`),
      UNIQUE KEY `path` (`path`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=22 ;

  • #2
    PHP-Code:
    FROM articles a,
    subarticles b 
    gruß
    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Das ändert aber nichts am ergebnis! Oder raff ich da grad was nicht

      Kommentar


      • #4
        Es gehört natürlich nichts, das in der zweiten tabelle vorkommt zuerst ein mal in die erste Tabelle. also schmeiss das raus, dann sollte auch deine Abfrage funktionieren. Ich würde sie allerdings so formulieren:
        PHP-Code:
        SELECT 
            a
        .header AS mainheader
            
        a.text AS maintext,
            
        a.creation_date AS crdate,
            
        a.author AS author,
            
        a.last_updated AS lastupdate,
            
        b.header AS subheader 
        FROM 
            articles 
        AS a,
        INNER JOIN
            subarticles 
        AS b ON a.id b.reference
        WHERE 
            DATE
        (a.dateBETWEEN '$newStartDate' AND  '$newEndDate'
        ORDER BY 
            a
        .id
            
        b.path 
        Gruss
        H2O

        Kommentar


        • #5
          @toppas
          du wirst seitens mysql keine 1:1 ausgabe erhalten, wie du sie willst. den rest, also die filterung, musst du immer noch in php machen.
          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


          Kommentar


          • #6
            Danke euch. Das alles über PHP zu filtern hab ich eigentlich nicht vor, da ja doch einiges an überflüssigem mit abgefragt wird. Dann ist es wohl am besten ich überarbeite nochmal den DB-Aufbau, damit ich das dann gescheit abfragen kann.

            Kommentar


            • #7
              cool ... man passt das db-design an seine queries an ... habe ich noch nie erlebt ...
              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


              Kommentar


              • #8
                Jopp - ich will an dem query nichts - aber auch gar nichts verändern daher bleibt mir nur die db zu ändern

                Es ist so wie h20 gesagt hat - in der 1. Tabelle steht auch Zeug das in der 2. mit drin steht - muss ja nicht sein

                Kommentar

                Lädt...
                X