php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 12-03-2011, 07:21
medium22
 Registrierter Benutzer
Links : Onlinestatus : medium22 ist offline
Registriert seit: Mar 2006
Beiträge: 308
medium22 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard Query mit sich selbst referenzieren?

Hallo,


Ich suche einen Ansatz für ein Problem, welches sich mir stellen wird - zumindest von der Planung bzw. den Planungsgedanken her.

Zuerst eine kurze Erklärung was es am Ende werden soll. Auch wenn es den PHP-Bereich streifen wird, so denke ich, dass es doch eine Lösung in MySQL geben wird.
In einem System sind verschiedene User für verschiedene Bereiche zuständig bzw. verantwortlich. Damit dabei aber sichergestellt werden kann, dass nicht der eine oder andere viel mehr als die anderen mit arbeiten, soll es eine Beschränkung auf maximal drei Bereiche geben.
Das Ganze wäre einfacher zu lösen, wenn man vor dem Speichern (also nachdem der Speicher-Button betätigt wurde) eines neuen Bereichs prüft, ob diese Grenze schon erreicht wurde oder nicht. Aber das macht ja auch keinen Sinn, wenn man dem Bearbeiter alle Usernamen ausspuckt, jedoch nur eine gewisse Anzahl davon überhaupt in Frage kommen würden aufgrund der genannten Grenze.
Demzufolge sollten schon bei der Auswahl nur jene Usernamen erscheinen, welche diese Grenze noch nicht erreicht haben und genau dafür fehlt mir der sinnvollste Ansatz. Hätte da zwar einen, aber den empfinde ich etwas sehr umständlich, weil dieser mehrere Query's (mind. zwei) und Kontrollstrukturen/Schleifen benötigt.

Die dazugehörigen Tabellen sind ziemlich einfach aufgebaut

- bereiche (sind die Bereiche selbst)
-> id (auto_increment, primarykey)
-> bereichsname (text)
-> und noch weitere die aber hierbei nicht von relevanz sind

- zu_bereich (Relationstabelle zu User und Bereiche)
-> id (auto_increment, primarykey)
-> userid (Id des Users)
-> bereichsid (Id des Bereichs)


Ist es nun möglich, einen Query so zu gestalten, dass er die gleichen Inhalte zählt und mir nur jene ausgibt welche noch keine drei mal vorhanden sind?

So in der Art von
Code:
// ...
COUNT(userid) as c_UserId FROM zu_bereich WHERE c_UserId <= '2' 
// ...
Also so, dass im selben Query schon die WHERE-Bedingung vom Ergebnis profitiert. Ist sowas überhaupt möglich, bzw. gibts da einen besseren Ansatz?
Der Rest drum rum (JOINs, etc.) ist kein Problem, es happert aber an der Idee zum Erklärten.


Gruss
Mit Zitat antworten
  #2 (permalink)  
Alt 12-03-2011, 08:09
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Das sollte klappen.

GROUP BY nicht vergessen...
__________________
Wir werden alle sterben
Mit Zitat antworten
  #3 (permalink)  
Alt 12-03-2011, 19:09
medium22
 Registrierter Benutzer
Links : Onlinestatus : medium22 ist offline
Registriert seit: Mar 2006
Beiträge: 308
medium22 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Habe ich doch glatt eben mal getestet..

Code:
SELECT 
j.UserId AS uid, j.UserName AS UserName, c.bereichsname AS name, COUNT(z.UserId) AS c_uid 
FROM User j
JOIN zu_bereiche z ON (j.UserId = z.UserId) 
JOIN bereiche c ON (z.bereichsid = c.id) 
WHERE (/* versch. Rechte die vorhanden sein müssen */) AND c_uid <= '2' 
GROUP BY z.UserId 
ORDER BY c.bereichsname, j.UserName
... liefert ein Unknown column 'c_uid' in 'where clause'

Das die Tabelle 'zu_bereiche' noch leer ist, dürfte dabei keine Rolle spielen, oder?
Mit Zitat antworten
  #4 (permalink)  
Alt 12-03-2011, 20:10
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Du kannst in der WHERE-Klausel keine Alias verwenden;
und für das, was du vorhast, solltest du sowieso HAVING stattdessen nutzen.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #5 (permalink)  
Alt 13-03-2011, 00:42
medium22
 Registrierter Benutzer
Links : Onlinestatus : medium22 ist offline
Registriert seit: Mar 2006
Beiträge: 308
medium22 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Ein..

Code:
SELECT 
j.UserId AS uid, j.UserName AS UserName, c.bereichsname AS name 
FROM User j
JOIN zu_bereiche z ON (j.UserId = z.UserId) 
JOIN bereiche c ON (z.bereichsid = c.id) 
WHERE /* versch. Rechte die vorhanden sein müssen */ 
GROUP BY z.UserId 
HAVING COUNT(z.UserId) <= '2' 
ORDER BY c.bereichsname, j.UserName
... liefert schon mal keinen Fehler mehr. Allerdings ist die Ergebnismenge null. Klingt auf der einen Seite logisch weil die Tabelle leer ist. Auf der anderen Seite aber, erfüllt auch eine leere Tabelle das Kriterium 'weniger als 3' (der HAVING-Klausel). Es müssten also alle möglichen UserNamen ausgegeben werden?!
Möglich das es am JOIN liegt, der nur Usernamen holt die auch in der (noch leeren Tabelle) zu finden wären? Also wäre auch im Falle einer nicht leeren Tabelle das Ergebnis falsch, wie ich meine.
Wie muss ich die Sache nun angehen um das zu umgehen?
Mit Zitat antworten
  #6 (permalink)  
Alt 13-03-2011, 20:30
medium22
 Registrierter Benutzer
Links : Onlinestatus : medium22 ist offline
Registriert seit: Mar 2006
Beiträge: 308
medium22 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Hallo,


Da ich keine Möglichkeit finden konnte das in einem Query abzufragen, habe ich das nun auf zwei verteilt und benutze dann die Array-Funktionen um ans Ziel zu kommen. Funktioniert wie es soll, auch wenn es etwas mühsam zu machen war.


Danke
Mit Zitat antworten
  #7 (permalink)  
Alt 07-04-2011, 12:26
sushimesser
 Registrierter Benutzer
Links : Onlinestatus : sushimesser ist offline
Registriert seit: Mar 2011
Beiträge: 5
sushimesser befindet sich auf einem aufstrebenden Ast
Standard

Hallo

Obwohl das Problem gelöst zu sein scheint, möchte ich trotzdem zum Join noch etwas anmerken. Du hättest schon die User bekommen die auch noch keinem Projekt zugeordnet sind weil die zu_bereiche-Tabelle leer ist, wenn du ein LEFT LOIN verwendet hättest:

from User j
LEFT JOIN
zu_bereiche z ...
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Sich selbst aufrufende Funktion sfischer PHP Developer Forum 1 02-06-2010 22:49
Links auf sich selbst Thorsten G. Fragen zu Installation & Konfiguration (LAMP, WAMP & Co.) 3 12-04-2005 15:00
Tabelle mit sich selbst verknüpfen code404 SQL / Datenbanken 2 25-09-2003 09:14
Tabelle mit sich selbst verknüofen Roogla SQL / Datenbanken 1 07-07-2003 10:59
sich selbst löschen blowfish PHP Developer Forum 6 26-02-2003 16:26

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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 an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:38 Uhr.