Seite 1 von 1
SQL-Abfrage: Problem mit Datum
Verfasst: 12.02.2008 16:03
von ceho
Hallo zusammen, vorab, ich habe leider praktisch keine Erfahrungen mit SQL-Abfragen, deshalb bitte ich Euch nach langem Epxerimentieren und Suchen im Forum um Hilfe. Ich möchte eine Abfrage starten, die mir folgende Ergebnisse liefert:
username, user_email
von usern, die mehr als 1x gepostet haben und deren letzter post vor dem 01.01.2008 geschrieben wurde.
Folgendes habe ich schon zusammenbekommen, aber das Ergebnis stimmt nicht (es werden irgendwie alle user angegeben...).
Code: Alles auswählen
SELECT `phpbb_users`.`username` , `phpbb_users`.`user_email` , `phpbb_users`.`user_posts`
FROM phpbb_users, phpbb_posts
WHERE (
(
`phpbb_users`.`user_posts` >1
)
AND (
`phpbb_posts`.`post_time` >2008 -01 -01
)
)
LIMIT 60 , 60
Kann mir jemand verraten wo mein Fehler liegt und/oder eine entsprechende funktionierende Abfrage nennen?
Herzlichen Dank im voraus!!
Verfasst: 12.02.2008 16:34
von buegelfalte
Code: Alles auswählen
SELECT username, user_email, user_posts
FROM phpbb_users, phpbb_posts
WHERE
user_posts > 1
AND post_time > 1199142001
AND poster_id = user_id
GROUP BY username
1199142001 = 1.1.2008 0:00:01 (timestamp)
Du hattest nicht angegeben, daß die poster_id aus der phpbb_posts mit der user_id aus der phpbb_users übereinstimmen muß, die Verknüpfung fehlte also komplett, daher kriegst du
alle User. (aber du wolltest ja nur welche, die einen Post haben)
Und: das "GROUP BY" ist nötig, damit du jeden User nur einmal bekommst.
B.
EDIT: wer lesen kann ...
"deren letzter post
vor dem 01.01.2008 geschrieben wurde" - wird damit natürlich nicht abgefragt (das hätte dein Query aber auch nicht gemacht bei "post_time
größer 1.1.08 ), aber damit kannst du jetzt wenigstens weiter experimentieren

Verfasst: 12.02.2008 16:48
von ceho
Schon einmal ganz herzlichen Dank! Ich habe diese Abfrage so gestartet und alle user herausbekommen, die nach dem 01.01.2008 gepostet haben. Dann habe ich das > vor dem Datum in ein < umgedreht und es kam ein Ergebnis heraus, das grösstenteils zu stimmen scheint.
Allerdings sind nachweislich auch user in diesem Ergebnis dabei, die auch nach dem 01.01.2008 gepostet haben, z.B. ein Admin und ein Mod (und weitere). Allerdings kann ich hier absolut keinen Zusammenhang erkennen.
Hast Du evtl. eine Idee woher dies noch kommen könnte?
Vielen Dank!!!!
P.S. Könnte man das Datum des letzten Posts noch augeben lassen? Dann könnte ich das Ergebnis ja danach noch sortieren...
Verfasst: 12.02.2008 16:51
von buegelfalte
ceho hat geschrieben:Hast Du evtl. eine Idee woher dies noch kommen könnte?
Klar: du fragst ab (bzw. willst abfragen), ob jemand VOR dem 1.1. gepostet hat, ob NACHher noch gepostet wurde, ist in dem Query überhaupt nicht vorhanden.
ceho hat geschrieben:P.S. Könnte man das Datum des letzten Posts noch augeben lassen? Dann könnte ich das Ergebnis ja danach noch sortieren...
nicht, wenn du die nicht auch in das SELECT mit einbaust, du kannst also nicht sagen "hol mir alle VOR dem 1.1. und gib mir das letzte NACH dem 1.1. an", da die erste Bedingung die zweite ausschließt
ich würde mir wahrscheinlich alle User holen, die überhaupt mehr als einen Post haben, die in einer Schleife durchlaufen und dann mit einem weiteren Query (pro User) testen, wann der letzte Post war (aber auch nur, weil ich zu faul für ultrakomplexe Queries bin, die dann 20min. brauchen, um ausgeführt zu werden)
aber wie es am besten funktioniert, findest du schon raus
B.
Verfasst: 12.02.2008 16:55
von ceho
Ah OK, verstehe. Wärest Du denn so nett mir noch zu verraten, wie ich Punkt 1 abdecke, ich also nur die user herausbekomme, die VOR dem 01.01. mindestens einmal gepostet haben, jedoch NACH dem 01.01. nicht mehr? Genau dann hätte ich ja mein Ergebnis...
Tausend Dank für die schnelle Hilfe, das bringt mich echt weiter!!
Verfasst: 12.02.2008 16:55
von buegelfalte
s.o.: Schleife, das ist am einfachsten, wenn du dich mit SQL nicht auskennst
es gibt auch verschachtelte Queries (2 oder mehr in einer Abfrage), wo du dir erst alle User holst, die min. 2 Posts haben, und aus denen dann die, deren letzter Post vor dem 1.1. lag (mit der MAX(post_time)-Funktion), aber wie gesagt: selbst rausfinden bringts

Verfasst: 12.02.2008 17:10
von ceho
aber wie gesagt: selbst rausfinden bringts
Sehe ich zwar genauso, in meinem Fall komme ich mir vor wie ein Kindergartenkind, dem ein Uni-Professor sagt schreib mal 'ne Doktorarbeit

. Ich beschäftige mich heute gerade das zweite Mal in meinem Leben mit SQL-Abfragen (bin ja nur ein Hobby-Bastler).
Na hoffentlich komme ich mit Deinen Hinweisen irgendwie weiter

.
Danke auf jeden Fall.
Verfasst: 12.02.2008 18:48
von buegelfalte
ceho hat geschrieben:Sehe ich zwar genauso, in meinem Fall komme ich mir vor wie ein Kindergartenkind, dem ein Uni-Professor sagt schreib mal 'ne Doktorarbeit

.
Aber ein Kindergartenkind, was immer nur sagt: "
Mach du mal für mich, ich kanns nicht." lernt auch nix
Code: Alles auswählen
SELECT username, user_email, user_posts, MAX( post_time ) AS lastpost
FROM phpbb_users, phpbb_posts
WHERE user_posts >1
AND poster_id = user_id
GROUP BY username
HAVING lastpost <1199142001
B.
Verfasst: 12.02.2008 18:52
von ceho
Aber ein Kindergartenkind, was immer nur sagt: "Mach du mal für mich, ich kanns nicht." lernt auch nix
Klarer Fall!!
War ja auch nicht böse gemeint, meine Anmerkung. Step by step, und dann bekommt es auch das "Kindergartenkind" hin
Und Deine Abfrage fluppt nur so, ganz herzlichen Dank, echt!!!! Und gelernt habe ich nun auch einiges, das nächste Mal begreife ich dann schon etwas schneller

.
Nochmals Danke für Deine Hilfe!!