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:
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:
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
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;
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)
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
Kommentar