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 22-02-2009, 16:59
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 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
Mit Zitat antworten
  #2 (permalink)  
Alt 22-02-2009, 18:00
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #3 (permalink)  
Alt 22-02-2009, 18:15
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

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 >= 
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*
Mit Zitat antworten
  #4 (permalink)  
Alt 22-02-2009, 18:20
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

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 >= 
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)
Mit Zitat antworten
  #5 (permalink)  
Alt 22-02-2009, 18:31
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

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*
Mit Zitat antworten
  #6 (permalink)  
Alt 22-02-2009, 18:33
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

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 >= 
peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
Mit Zitat antworten
  #7 (permalink)  
Alt 22-02-2009, 18:38
phpguru42
 Newbie
Links : Onlinestatus : phpguru42 ist offline
Registriert seit: Oct 2008
Beiträge: 71
phpguru42 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Müsste doch mit einem Subselect ganz gut gehen?

SELECT * FROM members WHERE userid NOT IN (SELECT userid FROM statistik WHERE monat = '02')
Mit Zitat antworten
  #8 (permalink)  
Alt 22-02-2009, 18:42
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #9 (permalink)  
Alt 22-02-2009, 18:49
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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
Mit Zitat antworten
  #10 (permalink)  
Alt 22-02-2009, 18:52
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

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 
Mit Zitat antworten
  #11 (permalink)  
Alt 22-02-2009, 18:56
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Performanter als? Du hast doch nur eine Lösung!?
Mit Zitat antworten
  #12 (permalink)  
Alt 22-02-2009, 18:59
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

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*
Mit Zitat antworten
Antwort

Lesezeichen


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

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 21:19 Uhr.