Problem mit Ausgabe/Abfrage bei n:m-Beziehung

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

  • Problem mit Ausgabe/Abfrage bei n:m-Beziehung

    Halli hallo,

    ich habe ein kleines Beziehungsproblem und hoffe, dass mir jemand bei der Ausgabe/Abfrage von Tabellen mit n:m-Beziehung helfen kann.

    Die Tabellen sehen so aus:

    Code:
    CREATE TABLE `nt_notes` (
      `id` int(11) NOT NULL auto_increment,
      `title` varchar(255) collate latin1_german2_ci default NULL,
      `note` text collate latin1_german2_ci,
      `date` int(11) NOT NULL default '0',
      `date_changed` int(11) default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;
    
    CREATE TABLE `nt_tags` (
      `id` int(11) NOT NULL auto_increment,
      `tag` varchar(255) collate latin1_german2_ci NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;
    
    CREATE TABLE `nt_tags_notes` (
      `id_notes` int(11) NOT NULL default '0',
      `id_tags` int(11) NOT NULL default '0'
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;
    nt_notes enthält Notizen, nt_tags enhält Tags zu den Notizen und nt_tags_notes verknüpft die beiden über die IDs.

    Nun möchte ich einfach eine Liste der Notizen ausgeben und zu jeder Notiz die entsprechenden Tags. Momentan frage ich dazu nt_notes ab und in der while-Schleife dann jeweils extra nach den Tags, was natürlich bei größer werdender Datenmenge nicht so performant ist.

    Um alles in einer Abfrage zu bekommen, würde ich es mit folgendem versuchen:
    Code:
    SELECT nt_notes.id,
      nt_notes.title,
      nt_notes.note,
      nt_tags_notes.id_tags,
      nt_tags_notes.id_notes,
      nt_tags.id,
      nt_tags.tag,
      nt_tags_notes.id_notes
    FROM nt_notes, nt_tags_notes, nt_tags
    WHERE (nt_notes.id = nt_tags_notes.id_notes)
      AND (nt_tags.id = nt_tags_notes.id_tags)
    Da fehlen dann aber die notes, die keine passenden Einträge in Tags haben. Vermute, dass ich ein (LEFT) JOIN benötige, habe aber keine Ahnung, wie ich das einsetzen kann.

    Seh ich dass richtig, dass ich die durch mehrere Tags erhaltenen doppelten Zeilen, die sich nur durch die Tas unterscheiden, nur manuell per PHP rausfiltern kann (Gruppenwechsel)?

    Freue mich auf hilfreiche Antworten,
    od

  • #2
    Hallo,

    ja, du solltest von diesen Theta-Style Joins wegkommen und die (Left) Join Syntax benutzen. Wie du das anstellst, verrät das MySQL-Handbuch auf einfache Weise und mit vielen Beispielen. Den Gruppenwechsel mit PHP zu programmieren ist mit verschachtelten assoziativen Arrays ganz einfach.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar

    Lädt...
    X