![]() |
[MySQL] Select und Feld für neues Select verwenden
Hi,
ich weis der titel klingt merkwürdig, wusste aber nicht, wie man es anders kurz beschreiben kann. ich versuche mal mein Anliegen zu beschreiben :) erstmal zu meiner Struktur: also ich hab 2 Tabellen (eigentlich 3, aber sollte sich nicht mehr viel ändern). users und events ziel ist es in ein funktioner die user (über Änderungen an einem Event) zu benachrichtigen, die dies für alle events oder für zugeteilte events möchten. dazu gibts in der usertabelle das Feld `Notification`,dies ist ein set, was u.a. die werte "all" und "own" (vereinfacht) enthält. die eventtabelle ist eine zuordnung zwischen den events selbst (sind in anderer Tabelle definiert) und den usern. es gibt also eine Event_id und eine User_id pro datensatz. z.b. können zur Event_ID 5 mehrere Datensätze mit diversen User_ids vorhanden sein. die event-id ist zum zeitpunkt der Benachrichtigung bekannt. was will ich nun erreichen? ich brauche eine abfrage, welche mir die datensätze der usertabelle zurückgibt, die
mein bisheriges Statement unterstützt nur die all-funktion:
Code:
da verbinde ich gleichzeitig die usertabelle mit der login-tabelle (um an die mail-adresse heranzukommen), evtl kann man von diesem statement gleich ausgehen...
SELECT * FROM `#__eventusers` , `#__users` WHERE ( jos_eventusers.Login_ID = jos_users.id) AND FIND_IN_SET( 'Mail_".$data["Notify_Type"]."', `Notification` )
ich hoffe, ich habe es verständlich formuliert, wenn nicht => bitte fragen :) Gruß Frank |
Re: [MySQL] Select und Feld für neues Select verwenden
Also es ist sehr schwer dir zu helfen, weil man aus deinen Infos irgendwie nicht schlau wird (zumindest ich, sorry bin eben einfach doof)
Zitat:
Zitat:
Was ist jetzt bitte der Mail...-Gedöhns? Soetwas ist kein Beispiel, lass es lieber weg, damit verschreckt du alle, die dir helfen wollen. Zitat:
Zitat:
Trotzdem versuche ich dir zu helfen, auch wenn es Schwerstarbeit ist...
SQL-Code:
Warum muss du unbedingt FIND_IN_SET benutzen?
SELECT *
FROM users u WHERE notification = 'all' OR ( notification = 'own' AND EXISTS (SELECT * FROM events WHERE login_id = u.id)) Mein Vorschlag ist vermutlich nur blödsinn, sorry, wenn das so sein sollte und dann bitte einfach ignorieren. Vielleicht kann dir dann jemand anderes helfen. |
Re: [MySQL] Select und Feld für neues Select verwenden
Hallo Omata (und alle die ich verschreckt habe)
erstmal danke für den Versuch, mich zu verstehen :) Zitat:
Zitat:
die login-tabelle ist nicht von mir, die nutze ich nur. prinzipiell läuft es so, dass ich in meiner usertabelle die Login_id (also die ID in der login-tabelle) als Verbindungsreferenz speichere. das o.g. Select könnte man auch mit einem LeftJoin machen. die Hochkommata hab ich mir angewöhnt, weils phpmyadmin auch so macht :) Zitat:
Zitat:
Users=Login-Tabelle (nicht von mir) Eventusers=Benutzertabelle der Benutzer für die Einsätze (Login_ID=>Users.ID), hier ist das "Notification-Feld" Events=Tabelle der Einsätze (Pro einsatz ein Datensatz) EventHelper=zuordnung der Einsatzkräfte zu den Einsätzen (Helper_ID=>Eventusers.ID,Event_ID=>Events.ID) Zitat:
Zitat:
mal ein bisschen pseudocode, um das bisschen zu enträtseln das Problem ist $helperid, weil ich die mir aus der eventusers holen müsste (unteres Statement), geht aber nur, indem ich beide selects zusammenbaue. es sind also beide selects voneinander abhängig.
SQL-Code:
Hoffentlich hab ich jetzt bisschen Licht ins Dunkel bringen können
SELECT * From EventHelper Where (Helper_ID='$helperid') AND (Event_ID=$eventid)
SELECT * FROM eventusers WHERE (Notification = "Mail_All") or ((Mail_Own) and (count(oberes select)>0)) Gruß Frank |
Re: [MySQL] Select und Feld für neues Select verwenden
Zitat:
Allerdings hattest du oben geschrieben, dass du die Inhalte der Tabelle "users" ausgeben willst. Welche ist das jetzt in deinem neuen Beispiel? Das ist doch wie mein letzter Vorschlag...
SQL-Code:
Allerdings muss die äußere Tabelle (FROM) noch mit der Inneren (EXISTS) verbunden werden, da ich deine Tabellenstruktur nicht wirklich kenne, geht es hier jetzt nicht weiter.
SELECT *
FROM eventusers WHERE Notification = "Mail_All" OR ( Mail_Own AND EXISTS (SELECT * FROM EventHelper WHERE Helper_ID = '$helperid' AND Event_ID = $eventid)) Zitat:
|
Re: [MySQL] Select und Feld für neues Select verwenden
ok, dann würde exists reichen
nur $helperid=eventusers.id aus der ersten select-anfrage bei dir...da liegt das problem :) das ist die verbindung... es ist nicht so, dass sich nur das untere auf das obere bezieht sondern auch das obere auf das untere. wenn nicht all gesetzt ist sondern nur own (in eventhelper.notification), muss in der #__eventhelper geschaut werden, ob der benutzer (eventhelper.id) zusammen mit der event-id auftaucht. gut, das mit der groß kleinschreibung wusste ich nicht...noch etwas gelernt :) mal noch die strukturen im detail:
SQL-Code:
CREATE TABLE IF NOT EXISTS `jos_eventhelper` (
`ID` int(11) NOT NULL auto_increment, `Event_ID` int(11) NOT NULL, `Helper_ID` int(11) NOT NULL, `From_Time` datetime default NULL, `To_Time` datetime default NULL, `Job` text NOT NULL, `Vehicle` tinyint(4) default NULL, `Confirmed` tinyint(4) default NULL, `State` tinyint(4) default NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=45 ; CREATE TABLE IF NOT EXISTS `jos_events` ( `ID` int(11) NOT NULL auto_increment, `Category` tinyint(4) default NULL, `Name` text NOT NULL, `Private` tinyint(1) default NULL, `Location` varchar(30) NOT NULL, `Report` text NOT NULL, `Photo` varchar(100) NOT NULL, `Gallery_Link` varchar(100) NOT NULL, `Gallery_ID` tinyint(4) default NULL, `From_Time` datetime NOT NULL, `To_Time` datetime NOT NULL, `Meeting_Point` text NOT NULL, `Meeting_Time` datetime NOT NULL, `Vehicles` tinyint(4) NOT NULL, `Notes` text NOT NULL, `Clothing` tinyint(4) default NULL, `Comments` text NOT NULL, `Last_Change` datetime NOT NULL, `Last_Change_User_ID` int(11) NOT NULL, `Test` tinyint(4) default NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=22 ; CREATE TABLE IF NOT EXISTS `jos_eventusers` ( `ID` int(11) NOT NULL auto_increment, `Login_ID` int(11) NOT NULL, `Last_Name` varchar(15) NOT NULL, `First_Name` varchar(15) NOT NULL, `Status` varchar(10) NOT NULL, `Training` varchar(10) NOT NULL, `Driver_License` varchar(15) NOT NULL, `Street` varchar(20) NOT NULL, `ZIP` varchar(5) NOT NULL, `City` varchar(20) NOT NULL, `Birthday` date NOT NULL, `Telephone` varchar(15) NOT NULL, `Mobile` varchar(15) NOT NULL, `Last_Access` datetime NOT NULL, `Notification` set('Mail_Create_Event','Mail_Modify_Event','Mail_Modify_Helper','Mail_Modify_Comment','Mail_Own_Modify_Event','Mail_Own_Modify_Helper','Mail_Own_Modify_Comment') NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=64 ; CREATE TABLE IF NOT EXISTS `jos_users` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) NOT NULL default '', `username` varchar(150) NOT NULL default '', `email` varchar(100) NOT NULL default '', `password` varchar(100) NOT NULL default '', `usertype` varchar(25) NOT NULL default '', `block` tinyint(4) NOT NULL default '0', `sendEmail` tinyint(4) default '0', `gid` tinyint(3) unsigned NOT NULL default '1', `registerDate` datetime NOT NULL default '0000-00-00 00:00:00', `lastvisitDate` datetime NOT NULL default '0000-00-00 00:00:00', `activation` varchar(100) NOT NULL default '', `params` text NOT NULL, PRIMARY KEY (`id`), KEY `usertype` (`usertype`), KEY `idx_name` (`name`), KEY `gid_block` (`gid`,`block`), KEY `username` (`username`), KEY `email` (`email`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=86 ; ich benötige eigentlich nur den Datensatz aus der eventusers (bzw.die mail aus der jos_users per zusätzlichen select eventusers.login_id=users.id), der rest ist nur zum vergleich, um herauszufinden, wer benachrichtigt werden soll achso, weil ichs gerade sehe...Notification=xxx geht nicht, da notification ein set ist und ggf. mehrere flags beinhalten kann Gruß Frank |
Re: [MySQL] Select und Feld für neues Select verwenden
Zitat:
|
Re: [MySQL] Select und Feld für neues Select verwenden
Zitat:
als Beispiel: die suche nach Mail_All gibt die Datensätze mit den (Benutzer-) IDs 3 und 5 zurück:
SQL-Code:
die suche nach Mail_Own würde die Datensätze mit den folgenden IDs 2,4 und 6 zurückliefern,
SELECT * FROM #__eventusers WHERE FIND_IN_SET(Notification,Mail_All);
SQL-Code:
jetzt schaue ich in die #__eventhelper nach den IDs und der Einsatz-ID 10 (die ist fest, da von dieser getriggert wird => Einsatzänderung).
SELECT * FROM #__eventusers WHERE FIND_IN_SET(Notification,Mail_Own);
SQL-Code:
hier bleiben nur noch die IDs 2 und 6 übrig da Benutzer mit der ID 4 nicht beim Einsatz 10 dabei ist.
SELECT * FROM #__eventhelper WHERE (Event_ID=10) AND (Helper_ID in (2,4,6))
also habe ich genau 4 Datensätze (2,3,5,6), welche ich mit der jos_users verbinden könnte (eventuser.login_id=users.id) und habe bei diesen 4 Personen die Mail-Adresse |
Re: [MySQL] Select und Feld für neues Select verwenden
Also dein Text hört sich für mich so an, als ob du dein Problem für dich gelöst hast. Ich brauche die Lösung nicht, du musst mich also nicht überzeugen bzw. mir das solange erklären bis ich das auch alles verstehe.
Nach deinen Aussagen scheinnt ja alles klar zu sein, glückwunsch. |
Re: [MySQL] Select und Feld für neues Select verwenden
ne, mir mir fehlt genau die Verbindung zwischen dem inneren select und dem äußeren
|
Re: [MySQL] Select und Feld für neues Select verwenden
Und was spricht gegen folgende Abfrage?
SQL-Code:
SELECT *
FROM #__eventusers u WHERE FIND_IN_SET(Notification, Mail_All) OR ( FIND_IN_SET(Notification, Mail_Own) AND EXISTS (SELECT * FROM #__eventhelper WHERE event_id = 10 AND helper_id = u.login_id)) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz