Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Verschachtelte SQL nach Bedingungen filtern [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-webhosting
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Verschachtelte SQL nach Bedingungen filtern


 
teco2008
02-02-2010, 21:25 
 
Hallo zusammen,
sitze jetzt 4 Stunden mit allen möglichen Kombinationsversuchen an folgendem Problem:

Habe eine mehrdimensionale Gruppentabelle:
http://up.stmq.de/files/2.png
- sub_of = child Gruppe -> eine group_id
- sequence = Reihenfolge innerhalb einer "sub_of" group_id
- group_id = wird Benutzern in Zuordnungstabelle zugeordnet

welche wie folgt aussieht:
http://up.stmq.de/files/1.png
- group_id
- user_id

Was ich will ist eigentlich relativ einfach: ich möchte in einer Abfrage herausfinden, in welchen Gruppen der Nutzer X ist und welche die größte "sequence" der dazugehörigen "sub_of" group_id ist. Ziel ist es, automatisiert einen User ein Semester weiter zu schieben, und sequence einmal hochzuzählen um dann die dazugehörige (neue) group_id abzufragen und in die Zuordnungstabelle zu schreiben.

Meine bisherige Query sieht so aus:


SELECT sequence AS akt_child, max(pfh_groups.sub_of) AS akt_parent
FROM pfh_groups
LEFT JOIN pfh_users_to_groups ON pfh_groups.group_id = pfh_users_to_groups.group_id = 45
LEFT JOIN pfh_users ON pfh_users.user_id = pfh_users_to_groups.user_id
WHERE sub_of = 45
Dummerweise berücksichtigt dies nicht die sequence, die der User per Zurodnungstabelle über die group_id bereits erreicht hat, sondern gibt immer 1 aus.
Falls jemand eine einfachere Lösung parat hat, wäre ich echt super dankbar!
Grüße
Teco

 
EVAMasters
03-02-2010, 00:36 
 
Probier die o.ä. Richtung:

SELECT b.user_id, b.group_id, a.sequence FROM (SELECT MAX(sequence) AS sequence, sub_of FROM pfh_groups GROUP BY sub_of) a, pfh_users b
WHERE b.group_id = a.sub_of AND b.user_id = <<UserId>>

Gibt zu einem Benutzer alle GruppenIds, und die zugehörige größte Sequenz zurück.

 
AmicaNoctis
03-02-2010, 00:53 
 
Hallo,

wenn du die Möglichkeit hast, die DB-Tabelle umzugestalten, solltest du dir mal "Nested Sets" ansehen, das ist in diesem Fall vermutlich sehr hilfreich.

Gruß,

Amica

 
EVAMasters
03-02-2010, 10:41 
 
... dazugehörigen "sub_of" group_id ist.

Wenns anders gemeint ist, als es da steht, dann wirds schwieriger :readthis:

tell me

 
teco2008
03-02-2010, 11:48 
 
Hallo zusammen,
vielen Dank für die Tipps,
ich habe dank EVAMasters Denkanstoss nun folgende Query:


SELECT DISTINCT b.user_id, c.group_id, a.sequence FROM (SELECT MAX(sequence) AS sequence,
sub_of FROM pfh_groups GROUP BY sub_of) a, pfh_users b, pfh_users_to_groups c WHERE c.group_id = a.sub_of
AND b.user_id = '<<u_id>>' AND c.user_id = '<<u_id>>' AND c.group_id = <<parent_group_id>>
folgender Output:

user_id group_id sequence
7 ______ 45______ 6
Das gibt mir jetzt schonmal die höchste Sequence die für die group_id existiert - schonmal gut. Jedoch wird immer noch nicht die maximale sequence des Users über die group_id<->user_id Zuordnungstabelle selbst berücksichtigt, die ist momentan nur 3 bei group_id 51

die parent group_id rufe ich übrigens so ab (was bisher ganz passabel läuft):


SELECT max(pfh_groups.sub_of) AS akt_parent, pfh_groups.name AS akt_name FROM pfh_groups,
pfh_users, pfh_users_to_groups WHERE pfh_users.user_id = '".$u_id."' AND pfh_users.user_id = pfh_users_to_groups.user_id
AND pfh_groups.group_id = pfh_users_to_groups.group_id AND pfh_groups.sub_of != '0' ORDER BY pfh_groups.sequence
@AmicaNoctis: das Problem ist, dass das Projekt morgen vorgestellt wird und ich deswegen "leicht" unter Zeitdruck stehe :-)

Anbei nochmal ein dump der groups und user_to_groups tabelle zum besseren Verständnis: http://up.stmq.de/files/sql-problem.sql

Viele Grüße

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 06:58 Uhr.