Inner Join mit mehreren Variablen in einem Feld
_Philipp_
- datenbank
1 Rouven0 _Philipp_0 Vinzenz Mai0 EKKi
1 Vinzenz Mai
Hallo alle miteinander,
ich programmiere gerade an einem Aufgabenkalendar, in dem sich Benutzer eintragen können. Hierzu habe ich in einer MYSQL-Datenbank die folgende Tabelle angelegt:
CREATE TABLE `calendar` (
`calendar_id` int(11) NOT NULL auto_increment,
`startTime` datetime NOT NULL default '0000-00-00 00:00:00',
`endTime` datetime NOT NULL default '0000-00-00 00:00:00',
`calendar_cats_id` tinyint(3) NOT NULL default '0',
`location` varchar(255) NOT NULL default '',
`title` varchar(255) NOT NULL default '',
`description` tinytext NOT NULL,
`min_participants` tinyint(2) NOT NULL default '0',
`min_skill` tinyint(3) NOT NULL default '0',
`car` tinyint(1) NOT NULL default '0',
`calendar_acces` tinyint(3) NOT NULL default '0',
`auto_reminder` tinyint(3) NOT NULL default '0',
`notify` tinyint(1) NOT NULL default '0',
`user_id` varchar(255) NOT NULL default '0',
`visibility` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`calendar_id`)
) TYPE=MyISAM AUTO_INCREMENT=12 AUTO_INCREMENT=12 ;
In der Zeile user_id stehen mit einem Trennzeichen getrennt MEHRERE! id's von Benutzern, die sich auf diesen Termin angemeldet haben. Das Problem ist eben, dass es mehr als nur eine id ist.
Über die user_id referenziere ich dann auf die Tabelle users, aus der ich mir per Inner Join den Benutzernamen ausgeben lassen will.
Das ganze funktioniert jetzt natürlich nur vernünftig, wenn nur eine einzige id in meinem Feld calendar.user_id eingetragen ist.
Hier noch mal mein Select-SQL-Statement:
SELECT calendar.title,calendar.startTime,calendar.endTime,calendar.location,calendar.car,calendar.min_participants,users.user_familyname,users.user_realname FROM calendar INNER JOIN users ON calendar.user_id=users.user_id
Gibt es irgendeine Möglichkeit, dass ich auch mehrere Benutzer-ID's eingeben und dadurch mehrere Benutzernamen gleichzeitig herauslesen kann.
Also ich stelle mir das etwa so vor:
In 'calendar.user_id' steht "54,37,44,11"
In der Tabelle 'users' sind die Benutzer Fritz mit Id 54, Franz mit 37, Hugo mit 44 und Sepp mit 11.
Mein Select soll mir jetzt so etwas wie "Fritz,Franz,Hugo,Sepp" ausgeben.
Ich hoffe ich konnte mein Problem anschaulich genug darstellen.
Ich bin froh über jede Hilfe oder Vorschläge zu einer alternativen Lösung.
Vielen Dank
Hello,
Vorschläge zu einer alternativen Lösung.
eine Alternative ist die einzig sinnvolle Hilfe an dieser Stelle. Feldinhalte sind gem. Lehre der Normalisierung stets atomar - deine Liste von Userids ist nicht atomar. Da du dich (löblicherweise) sowieso mit dem Konzept sauberer Joins beschäftigst, kannst du auch direkt eine saubere Tabellenstruktur unterlegen - gliedere dazu deine Userzuordnung aus:
CREATE TABLE calendar_user (
calendar_id INT NOT NULL,
user_id INT NOT NULL,
PRIMARY KEY (calendar_id, user_id)
)
und entferne die Userspalte aus dem Kalender. Was machst du eigentlich, wenn mehr/längere User als 255 Zeichen beteiligt sind - das ist kein richtiges Konzept...
MfG
Rouven
Okay danke euch zwei,
das hier gefällt mir ganz gut, danke für den Hinweiß.
CREATE TABLE calendar_user (
calendar_id INT NOT NULL,
user_id INT NOT NULL,
PRIMARY KEY (calendar_id, user_id)
)
Aber wie frag ich denn dann jetzt am besten meine Benutzernamen ab.
Kann ich über dieses Inner Join die Benutzer-ID's abfragen?
INNER JOIN calendar.calendar_id=calendar_user.calendar_id
Und wie könnte ich daraus dann wiederum die Benutzernamen bekommen?
Oder müsste ich hierfür jetzt für jeden Kalendereintrag ein neues Select auf die Tabelle calendar_user starten?
Bin da noch nicht so geübt mit diesen Joins.
Danke
Hallo,
Okay danke euch zwei,
gerne.
» CREATE TABLE calendar_user (
» calendar_id INT NOT NULL,
» user_id INT NOT NULL,
» PRIMARY KEY (calendar_id, user_id)
» )Aber wie frag ich denn dann jetzt am besten meine Benutzernamen ab.
Kann ich über dieses Inner Join die Benutzer-ID's abfragen?
INNER JOIN
calendar.calendar_id=calendar_user.calendar_id
fast :-)
> Bin da noch nicht so geübt mit diesen Joins.
Das ist nichts Schlimmes, jeder hat einmal angefangen. In SELFHTML aktuell findest Du zwei Artikel zum Thema Joins, die ich Dir ans Herz legen möchte:
- [Einführung in Joins](http://aktuell.de.selfhtml.org/artikel/datenbanken/joins/)
- [Fortgeschrittene Jointechniken](http://aktuell.de.selfhtml.org/artikel/datenbanken/fortgeschrittene-joins/)
Die Autoren sollten Dir bekannt vorkommen ...
Freundliche Grüße
Vinzenz
Mahlzeit _Philipp_,
INNER JOIN calendar.calendar_id=calendar_user.calendar_id
So ähnlich. Die von Vinzenz verlinkten Tutorials dürften Dir haufenweise neue Erkenntnisse bringen.
Und wie könnte ich daraus dann wiederum die Benutzernamen bekommen?
Indem Du dann anschließend auch noch die user-Tabelle dazujoinst:
SELECT c.foo
, u.bar
FROM calendar c
JOIN calendar_user cu ON c.calendar_id = cu.calendar_id
JOIN user u ON cu.user_id = u.user_id
Wenn Du anschließend noch gruppierst, kannst Du auch mehrere Zeilen zusammenfassen (und die Benutzernamen z.B. durch GROUP_CONCAT() oder ähnliche Aggregatsfunktionen "anhübschen").
Bin da noch nicht so geübt mit diesen Joins.
Dann übe! :-)
MfG,
EKKi
Hallo,
In der Zeile user_id stehen mit einem Trennzeichen getrennt MEHRERE! id's von Benutzern, die sich auf diesen Termin angemeldet haben. Das Problem ist eben, dass es mehr als nur eine id ist.
beseitige diesen schwerwiegenden Fehler.
Gibt es irgendeine Möglichkeit, dass ich auch mehrere Benutzer-ID's eingeben und dadurch mehrere Benutzernamen gleichzeitig herauslesen kann.
keine sinnvolle.
In 'calendar.user_id' steht "54,37,44,11"
In der Tabelle 'users' sind die Benutzer Fritz mit Id 54, Franz mit 37, Hugo mit 44 und Sepp mit 11.
Mein Select soll mir jetzt so etwas wie "Fritz,Franz,Hugo,Sepp" ausgeben.
Ich bin froh über jede Hilfe oder Vorschläge zu einer alternativen Lösung.
Daten in Datenbanken sollen atomar vorliegen (erste Normalform). Halte Dich an diesen Grundsatz und Dein Problem löst sich von selbst auf. Nutze dazu eine Verknüpfungstabelle
user_calendar (oder so ähnlich).
Trage jede Zuordnung dort ein.
Freundliche Grüße
Vinzenz