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

22-02-2009, 16:59
|
|
medium22
Registrierter Benutzer
|
|
Registriert seit: Mar 2006
Beiträge: 306
|
|
Andere/bessere Variante möglich?
Hallo zusammen,
Ich suche eine bessere Variante für ein Statistikformular.
Ich habe eine Statistik, die einmal im Monat (normalerweise am Monatsanfang - aber das spielt keine Rolle) von Hand eingetragen wird. Hierzu gibt es eine select-bar zum auswählen des gewünschten Benutzers. Da es in meinen Augen aber zu nervig ist, nach jedem Eintrag wieder im select zum Usernamen zu scrollen, dachte ich mir, es müsste doch möglich sein die so zu gestalten das nur solche Usernamen dort aufgelistet werden die zum entsprechenden Monat noch keinen Statistikeintrag haben.
Soweit so gut.., ich grübelte also und bastelte mir etwas sehr seltsames zusammen was ansich auch funktioniert. Problem ist nur, dass es in meinen Augen viel zu viel Aufwand dafür ist, dass müsste doch auch kürzer gehen (ggf. sogar mit einem einzigen Query?)
Tabellen (gekürzt auf die notwendigen Inhalte):
members
------------
- userid
- username
statistik
-----------
- userid (userid aus tabelle members)
- monat
- jahr
So..,
als erstes setze ich einen Query auf members in dem ich userid und username abfrage und diese in jeweils einem array zwischenspeichere.
als zweites setze ich einen Query auf statistik ab, in dem ich alle vorhandenen userids zum aktuellen monat abfrage und diese auch in einem array zwischenspeichere.
im dritten schritt dann vergleiche ich die arrays und lasse mir nur jene Usernamen ausgeben, die zweiten userid-array nicht vorhanden sind.
Das ganze ist irgendwie viel kürzer beschrieben als es codezeilen hat *lach* .. Wie dem auch sei, ist ein solcher Vergleich über 2 Tabellen mit Bedingungen auch in einem einzigen Query möglich sodass ich auf dieses array-gebastel verzichten kann?
Ggf. falsches Sub, aber vll. gibt es auch eine php-variante das besser/anders zu lösen.
Gruss & Danke
|

22-02-2009, 18:00
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.311
|
|
PHP-Code:
SELECT
m.userid AS member
s.userid AS stat_member
FROM
statistik s
LEFT JOIN
members m ON (m.userid = s.userid)
WHERE
s.monat = irgendwas
wenn dann im array der index member leer ist, hat der keinen eintrag. geht bestimmt noch einfacher, aber in köln ist gerade karneval und ich kann mich nicht konzentrieren, wenn draussen die jecken toben.
ist übrigens ein sql-problem, daher verschiebe ich es mal
peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

22-02-2009, 18:15
|
|
medium22
Registrierter Benutzer
|
|
Registriert seit: Mar 2006
Beiträge: 306
|
|
Da ist schonmal der erste Knoten bei mir geplatzt, hatte aus es auch mit JOINs versucht, aber von der falschen Seite/Richtung her. *g*
Aaaaaber..., und jetzt kommts.. führe ich u.g. aus..
PHP-Code:
SELECT
m.UserId AS member,
m.UserName AS UserName,
s.nick AS stat_member
FROM
statistik s
LEFT JOIN
Members m ON (m.UserId = s.nick)
WHERE
s.monat = 02
AND
m.UserStatus >= 3
so bekomme ich ja nur ein Ergebniss (den UserNamen!) wenn ein Eintrag vorhanden ist. Aber ich brauche das genau andersrum, den UserNamen bekommen wenn KEIN Eintrag vorhanden ist. Nennt sich glaube ich 'rekursives Denken', was mir im Bezug auf MySQL nicht immer leicht fällt - und eben auch vor solch' ein Problem stellt.
Offtopic: Siehste, drum halte ich mich von Köln (u.ä. Städten) während der 5. Jahreszeit fern. *g*
|

22-02-2009, 18:20
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.311
|
|
draussen hämmern sie wie die verrückten auf ihren trommeln rum  und ich denke mal wieder falsch herum. einfach den join umkehren:
PHP-Code:
SELECT
m.UserId AS member,
m.UserName AS UserName,
s.nick AS stat_member
FROM
Members m
LEFT JOIN
statistik s ON (m.UserId = s.nick)
WHERE
s.monat = '02'
AND
m.UserStatus >= 3
peter
EDIT: wird auch nicht funktionieren wegen der bedingung. sch***s karneval. meld mich dienstag wieder
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
Geändert von Kropff (22-02-2009 um 18:23 Uhr)
|

22-02-2009, 18:31
|
|
medium22
Registrierter Benutzer
|
|
Registriert seit: Mar 2006
Beiträge: 306
|
|
So gehts mir öfters - Nachbarn (oben und rechts) mit Baby.
Wenn ich den JOIN drehe kommt immernoch in leeres Resultat raus obwohl kein Eintrag mit dem Monat '02' vorhanden ist - eigentlich müssten hier ja alle UserNamen rauskommen. *grübel*
Edit: Dachte grade. *tröst* Nur kein Stress, dass ist nichts was ums verrecken Heute gelöst werden muss, eher ein optimierungtick den ich zur Zeit habe *g*
|

22-02-2009, 18:33
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.311
|
|
letzter versuch, full outer join:
PHP-Code:
SELECT
m.UserId AS member,
m.UserName AS UserName,
s.nick AS stat_member
FROM
statistik s
LEFT JOIN
Members m ON (m.UserId = s.nick)
WHERE
s.monat = '02'
UNION
SELECT
m.UserId AS member,
m.UserName AS UserName,
s.nick AS stat_member
FROM
Members m
RIGHT JOIN
statistik s ON (m.UserId = s.nick)
WHERE
m.UserStatus >= 3
peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

22-02-2009, 18:38
|
|
phpguru42
Newbie
|
|
Registriert seit: Oct 2008
Beiträge: 71
|
|
Müsste doch mit einem Subselect ganz gut gehen?
SELECT * FROM members WHERE userid NOT IN (SELECT userid FROM statistik WHERE monat = '02')
|

22-02-2009, 18:42
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.311
|
|
Zitat:
Original geschrieben von phpguru42
Müsste doch mit einem Subselect ganz gut gehen?
SELECT * FROM members WHERE userid NOT IN (SELECT userid FROM statistik WHERE monat = '02')
|
du kommst aus keiner närrischen hochburg, oder?  das ist es.
peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

22-02-2009, 18:49
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Stichwort Subselect.
Code:
SELECT m.* FROM members m WHERE m.userid NOT IN (
SELECT s.userid FROM statistik s WHERE monat = MONTH(CURDATE()) AND jahr = YEAR(CURDATE())
)
EDIT: zu langsam
|

22-02-2009, 18:52
|
|
medium22
Registrierter Benutzer
|
|
Registriert seit: Mar 2006
Beiträge: 306
|
|
Hm, ne, Peter.
Damit kommen immer Usernamen, egal ob Eintrag vorhanden oder nicht.
@ phpguru42
Ja, ist eine funktionierende Möglichkeit, jedenfalls habe ich mit Deinem Beispiel grade etwas funktionierende Variante basteln können. Die Frage ist nun, was ist performanter?
PHP-Code:
SELECT
UserName
FROM
Members
WHERE
UserStatus >= '3'
AND
UserId
NOT IN
(SELECT
nick
FROM
statistik
WHERE
monat = '02')
ORDER BY
UserName
|

22-02-2009, 18:56
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Performanter als? Du hast doch nur eine Lösung!?
|

22-02-2009, 18:59
|
|
medium22
Registrierter Benutzer
|
|
Registriert seit: Mar 2006
Beiträge: 306
|
|
Performanter als zb. das was ich im Eingangsposting beschrieb - aber das wird es denke ich mal sein. Das lehnte sich eher an das Beispiel von Kropff im Vergleich zum Subselect. Da sah ich die weiteren Postings noch nicht. *g*
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| 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.
HTML-Code ist aus.
|
|
|
|
PHP News
|