AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [MySQL] Select und Feld für neues Select verwenden
Thema durchsuchen
Ansicht
Themen-Optionen

[MySQL] Select und Feld für neues Select verwenden

Ein Thema von _frank_ · begonnen am 5. Sep 2009 · letzter Beitrag vom 5. Sep 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#1

[MySQL] Select und Feld für neues Select verwenden

  Alt 5. Sep 2009, 15:51
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

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

  Alt 5. Sep 2009, 17:53
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 von _frank_:
...also ich hab 2 Tabellen: users und events
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 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 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.
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#3

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

  Alt 5. Sep 2009, 18:30
Hallo Omata (und alle die ich verschreckt habe)

erstmal danke für den Versuch, mich zu verstehen

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 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 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 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 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 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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

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

  Alt 5. Sep 2009, 18:43
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 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!
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#5

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

  Alt 5. Sep 2009, 19:59
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

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

  Alt 5. Sep 2009, 20:11
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.
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#7

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

  Alt 5. Sep 2009, 20:22
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:
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,
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).
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

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

  Alt 5. Sep 2009, 20:26
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.
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#9

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

  Alt 5. Sep 2009, 20:29
ne, mir mir fehlt genau die Verbindung zwischen dem inneren select und dem äußeren
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#10

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

  Alt 5. Sep 2009, 20:35
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))
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 Uhr.
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