Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [MySQL] Select und Feld für neues Select verwenden (https://www.delphipraxis.net/139796-%5Bmysql%5D-select-und-feld-fuer-neues-select-verwenden.html)

_frank_ 5. Sep 2009 14:51


[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
  • all im notification-feld stehen haben (hab ich schon, s.u.) oder
  • own im notification-feld stehen haben und gleichzeitig mindestens einen datensatz in der event-tabelle mit ihrer user-id und der event-id haben (die daten aus der event-tabelle selbst brauche ich nicht)

mein bisheriges Statement unterstützt nur die all-funktion:
Code:
SELECT * FROM `#__eventusers` , `#__users` WHERE ( jos_eventusers.Login_ID = jos_users.id) AND FIND_IN_SET( 'Mail_".$data["Notify_Type"]."', `Notification` )
da verbinde ich gleichzeitig die usertabelle mit der login-tabelle (um an die mail-adresse heranzukommen), evtl kann man von diesem statement gleich ausgehen...

ich hoffe, ich habe es verständlich formuliert, wenn nicht => bitte fragen :)

Gruß Frank

omata 5. Sep 2009 16:53

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 von _frank_
...also ich hab 2 Tabellen: users und events

Zitat:

Zitat von _frank_
Code:
SELECT * 
FROM `#__eventusers` , `#__users` 
WHERE ( jos_eventusers.Login_ID = jos_users.id)
  AND FIND_IN_SET( 'Mail_".$data["Notify_Type"]."', `Notification` )

Was ist das für ein Statement? Wieso heißen hier die Tabellen #__eventusers , #__users? Und lass bitte diese völlig überflüssigen und in ihrer Funktion nur negativ wirkenden Hochkommata weg!

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 von _frank_
own im notification-feld stehen haben und gleichzeitig mindestens einen datensatz in der event-tabelle mit ihrer user-id und der event-id haben (die daten aus der event-tabelle selbst brauche ich nicht)

Was soll der Teil mit "und der event-id haben"? Wie soll das gehen? Hast du in 'users' noch eine EventID gespeichert?

Zitat:

Zitat von _frank_
ich hoffe, ich habe es verständlich formuliert...

Für mich ganz und gar nicht, sorry.

Trotzdem versuche ich dir zu helfen, auch wenn es Schwerstarbeit ist...

SQL-Code:
SELECT * 
FROM users u
WHERE notification = 'all'
   OR (    notification = 'own'
       AND EXISTS (SELECT *
                   FROM events
                   WHERE login_id = u.id))
Warum muss du unbedingt FIND_IN_SET benutzen?

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.

_frank_ 5. Sep 2009 17:30

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 von omata
Also es ist sehr schwer dir zu helfen, weil man aus deinen Infos irgendwie nicht schlau wird (zumindest ich, sorry bin eben einfach doof)

hab ich schon befürchtet, ist aber auch blöd zu erklären, da das Ganze recht komplex aufgebaut ist.
Zitat:

Zitat von omata
Was ist das für ein Statement? Wieso heißen hier die Tabellen #__eventusers , #__users? Und lass bitte diese völlig überflüssigen und in ihrer Funktion nur negativ wirkenden Hochkommata weg!

#__eventusers ist die user-tabelle,#__users die login-tabelle (brauche ich nur, um mir die email zu holen). das #_ ist ein platzhalter, da das ganze innerhalb von Joomla läuft.
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 von omata
Was ist jetzt bitte der Mail...-Gedöhns?
Soetwas ist kein Beispiel, lass es lieber weg, damit verschreckt du alle, die dir helfen wollen.

das "Mail_".$Parameter ist der wert, der für die Art der Benachrichtigung steht, deswegen hab ich geschrieben "all" und "own" ist vereinfacht. die werte heißen z.b. Mail_Create_Event und Mail_Modify_Event als Beispiele für "all" und für Own würde der erste z.b. Mail_Own_Modify_Event heißen.
Zitat:

Zitat von omata
Was soll der Teil mit "und der event-id haben"? Wie soll das gehen? Hast du in 'users' noch eine EventID gespeichert?

gut, also mal eine auflistung aller beteiligten Tabellen, hoffe es wird dann ein bisschen klarer

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 von omata
Für mich ganz und gar nicht, sorry.

Trotzdem versuche ich dir zu helfen, auch wenn es Schwerstarbeit ist...

SQL-Code:
SELECT * 
FROM users
WHERE notification = 'all'
   OR (    notification = 'own'
       AND EXISTS (SELECT *
                   FROM events
                   WHERE login_id = u.id))
Warum muss du unbedingt FIND_IN_SET benutzen?

Was sollte ich alternativ nutzen um Sets auseinanderzunehmen? vom Prinzip her ists schon fast richtig, siehe unten meine statements. das Problem ist der querverweis (welche benutzer wollen infomiert werden => sind sie dem Einsatz zugeordnet).
Zitat:

Zitat von omata
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.

das Exists wrde ich mir mal anschauen, müsste nur auf die Eventhelper angewendet werden, wo die ID des gefundenen Benutzers aus der Eventusers (anhand der Notification) zusammen mit der Event_ID in der Eventhelper gesucht werden muss.

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:
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))
Hoffentlich hab ich jetzt bisschen Licht ins Dunkel bringen können

Gruß Frank

omata 5. Sep 2009 17:43

Re: [MySQL] Select und Feld für neues Select verwenden
 
Zitat:

Zitat von _frank_
SQL-Code:
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))

Und warum baust du die beiden Statements nicht zusammen? COUNT()>0 ist EXISTS...

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:
SELECT * 
FROM eventusers
WHERE Notification = "Mail_All"
  OR (    Mail_Own
      AND EXISTS (SELECT * 
                  FROM EventHelper
                  WHERE Helper_ID = '$helperid'
                    AND Event_ID = $eventid))
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.


Zitat:

Zitat von _frank_
die Hochkommata hab ich mir angewöhnt, weils phpmyadmin auch so macht :)

Sie sind blödsinn, weil dann die Groß-Kleinschreibung gilt -> autsch!

_frank_ 5. Sep 2009 18:59

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

omata 5. Sep 2009 19:11

Re: [MySQL] Select und Feld für neues Select verwenden
 
Zitat:

Zitat von _frank_
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.

Aber genau das tut doch der OR-Zweig.

_frank_ 5. Sep 2009 19:22

Re: [MySQL] Select und Feld für neues Select verwenden
 
Zitat:

Zitat von omata
Aber genau das tut doch der OR-Zweig.

fast...$helperid muss eventhelper.id sein, wenn eventhelper.notification Mail_Own enthält.

als Beispiel:
die suche nach Mail_All gibt die Datensätze mit den (Benutzer-) IDs 3 und 5 zurück:
SQL-Code:
SELECT * FROM #__eventusers WHERE FIND_IN_SET(Notification,Mail_All);
die suche nach Mail_Own würde die Datensätze mit den folgenden IDs 2,4 und 6 zurückliefern,
SQL-Code:
SELECT * FROM #__eventusers WHERE FIND_IN_SET(Notification,Mail_Own);
jetzt schaue ich in die #__eventhelper nach den IDs und der Einsatz-ID 10 (die ist fest, da von dieser getriggert wird => Einsatzänderung).
SQL-Code:
SELECT * FROM #__eventhelper WHERE (Event_ID=10) AND (Helper_ID in (2,4,6))
hier bleiben nur noch die IDs 2 und 6 übrig da Benutzer mit der ID 4 nicht beim Einsatz 10 dabei ist.

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

omata 5. Sep 2009 19:26

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.

_frank_ 5. Sep 2009 19:29

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

omata 5. Sep 2009 19:35

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 05:08 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz