[MySQL] Probleem met een selectie van de data

Pagina: 1
Acties:

  • Dryw.Filtiarn
  • Registratie: September 2001
  • Laatst online: 18-03 12:10
Ik zit met het volgende probleem:
Ik heb een tabel threads met de velden
* id
* forum_id
* user_id
* title
* content
* reply_to
* date
* mod_by
* mod_date
* status

En moet daar nu een selectie op uitvoeren die mij van een lijst van alle threads terug geeft op sortering van de datum van de laatste post in de thread.

Dus als ik als data heb:

record 1:
id = 1
forum_id = 1
user_id = 1
title = New topic
content = Blaat
reply_to = 0
date = 20020126201600
mod_by = NULL
mod_date = NULL
status = 1

record 2:
id = 2
forum_id = 1
user_id = 2
title = NULL
content = Reactie op New topic - Blaat
reply_to = 1
date = 20020126202000
mod_by = NULL
mod_date = NULL
status = 1

Dan moet ik de datum van de reactie(id = 2) terug krijgen oftewel 20020126202000.

Ik dacht zelf aan een query als "SELECT max(date) FROM threads WHERE id = reply_to", maar dat werkt niet, dan krijg ik als resultaat "NULL".

Kan iemand mij vertellen hoe het wel moet?

Even voor de duidelijkheid nog het gaat hier om een MySQL database.

=( Protected by witchcraft )=


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Als er geen thread met reply_to == 2 is, dan krijg je uiteraard NULL terug...

in principe is je query goed...

  • Dryw.Filtiarn
  • Registratie: September 2001
  • Laatst online: 18-03 12:10
Ja op zich inderdaad wel zou ik zeggen, maar het werkt niet :'(

Op dit moment gebruik in nog deze query voor de selectie van de lijst met topics:

"SELECT * FROM thread WHERE ( reply_to = '0' AND forum_id = 'xxx' ) OR forum_id = '0' ORDER BY status, date DESC"

Maar deze kijkt dus nog naar de datum van het aanmaken van het topic en moet dus dusdanig omgeschreven worden dat hij kijkt naar de datum van de laatste datum op een topic

=( Protected by witchcraft )=


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Is het niet een idee om eerst te vermelden wat je wilt?

Want wat je nou precies wilt bereiken is me niet duidelijk... Dat je een query bedacht heb is leuk, maar daar wordt je doel niet duidelijk van :)

Ik neem aan dat je alle topics gesorteerd op de datum van de laatste reactie wilt hebben?

Probeer dan zoiets:
select ... MAX(reply_date) as maxdate from ... where ... GROUP BY reply_to ORDER BY maxdate

  • Dryw.Filtiarn
  • Registratie: September 2001
  • Laatst online: 18-03 12:10
Thanx het is gelukt, ik ben uiteindelijk uitgekomen op deze query:

SELECT t1.*, MAX(t2.date) maxdate FROM thread t1, thread t2 WHERE t2.forum_id = '".$iID."' AND t1.id = t2.reply_to GROUP BY t2.reply_to ORDER BY status, maxdate DESC

Hiermee krijg ik dus de lijst met topics(oftewel de allereerste post) terug geordent op datum.

=( Protected by witchcraft )=


  • Dryw.Filtiarn
  • Registratie: September 2001
  • Laatst online: 18-03 12:10
De bovenstaande querie werkt nu opzich goed, maar wanneer ik nu een topic heb waarin nog geen replies staan geeft hij geen results terug op dat topic. En ik heb geen flauw idee van hoe ik hem nu zou moeten maken dat hij in het geval van geen replies het start bericht zou moeten pakken.

=( Protected by witchcraft )=


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je kan je model dusdanig aanpassen dat je startbericht altijd ook een gewoon bericht is, dus dat er altijd 1 bericht is.

Of je moet eromheen programmeren... Want dat kan imho niet met een gewone query (eventueel met een function, maar dat kent mysql niet).
Dus als je niks terug krijgt de andere waarde ophalen.

Kijk eventueel nog naar LEFT JOIN, daarmee kan je iig die "null velden" afvangen zodat je ook in dezelfde query nog de tijd van de thread zelf mee kan selecteren en het "omheen proggen" eenvoudiger is.

  • Dryw.Filtiarn
  • Registratie: September 2001
  • Laatst online: 18-03 12:10
Aan een join had ik inderdaad ook al gedacht maar hoe die dingen werken, dat zegt mij dus helemaal niks...

Maar ik zal eens kijken of ik er uit kan komen met een RTFM antwoord, anders kom ik hier wel weer terug.

En wat bedoel je precies met er omheen programmeren?

=( Protected by witchcraft )=


  • Dryw.Filtiarn
  • Registratie: September 2001
  • Laatst online: 18-03 12:10
Ik kom er dus echt niet uit :'(. Ik ben niet zo'n geweldige SQL'er met JOINs en dergelijke, al die basis dingen zijn niet zo'n heel groot probleem, maar als het wat complexer wordt ben ik weg...

Kun je me misschien even een eindje op weg helpen?

=( Protected by witchcraft )=


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

code:
1
2
3
4
5
6
7
8
9
SELECT 
    t1.*, 
    MAX(t2.date) maxdate 
FROM 
    thread t1 
LEFT JOIN thread t2 ON  t1.id = t2.reply_to 
WHERE t1.forum_id = '$iID'
GROUP BY t1.id
ORDER BY status, maxdate DESC

Misschien dat zoiets werkt?
* ACM is ook niet zo'n geweldige Join-er ;)

  • Dryw.Filtiarn
  • Registratie: September 2001
  • Laatst online: 18-03 12:10
Op zondag 27 januari 2002 11:47 schreef ACM het volgende:
code:
1
2
3
4
5
6
7
8
9
SELECT 
    t1.*, 
    MAX(t2.date) maxdate 
FROM 
    thread t1 
LEFT JOIN thread t2 ON t1.id = t2.reply_to 
WHERE t1.forum_id = '$iID' OR t1.forum_id = '0'
GROUP BY t1.id
ORDER BY status, maxdate DESC

Misschien dat zoiets werkt?
* ACM is ook niet zo'n geweldige Join-er ;)
In ieder geval bedankt, hij doetut... Nu krijg ik alleen het probleem dat ik ook een NULL reactie terug krijg als de laatste post die gedaan is in het forum valt waar je op dat moment inzit, maar dat is een kwestie van filteren in PHP...

Thnx...

=( Protected by witchcraft )=


  • Dryw.Filtiarn
  • Registratie: September 2001
  • Laatst online: 18-03 12:10
Ik was alweer te vroeg met juichen. Alles leek in eerste instantie goed te gaan, maar het probleem bestaat nog steeds :'( Als je wilt weten wat ik bedoel moet je even kijken op http://forum.webstorm.nl.nu wanneer hier een topic staat dat nog geen replies heeft kan hij niet goed geplaats worden in de lijst. Op het moment dat er wel een reply is gaat het wel goed...

edit:

In het "Meetingpoint" forum kun je zien dat het fout gaat en in "Feedback [forum.webstorm.nl.nu]" gaat het wel goed...

=( Protected by witchcraft )=


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Wat je misschien beter kan doen is een "laatste replytijd" veld maken in je thread...

En wellicht onderscheid maken tussen een "thread" en een "reply" zodat je daardoor alleen maar hoeft te sorteren op het thread.laatstereplytijd veld...

Dat is iig de manier zoals vele forums het doen.

  • Dryw.Filtiarn
  • Registratie: September 2001
  • Laatst online: 18-03 12:10
Op zondag 27 januari 2002 13:11 schreef ACM het volgende:
Wat je misschien beter kan doen is een "laatste replytijd" veld maken in je thread...

En wellicht onderscheid maken tussen een "thread" en een "reply" zodat je daardoor alleen maar hoeft te sorteren op het thread.laatstereplytijd veld...

Dat is iig de manier zoals vele forums het doen.
Dan doe ik dat wel denk ik... Maar ik had zoiets van dan heb ik dubbele data in de database.

=( Protected by witchcraft )=


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op zondag 27 januari 2002 13:14 schreef Dryw.Filtiarn het volgende:
Dan doe ik dat wel denk ik... Maar ik had zoiets van dan heb ik dubbele data in de database.
Tsja, wel dubbele data, maar het is dan een stuk sneller en simpeler ;)

Overigens heb je nu af en toe ook dubbele data, zoals forum_id.

  • Dryw.Filtiarn
  • Registratie: September 2001
  • Laatst online: 18-03 12:10
Op zondag 27 januari 2002 13:19 schreef ACM het volgende:

[..]

Tsja, wel dubbele data, maar het is dan een stuk sneller en simpeler ;)

Overigens heb je nu af en toe ook dubbele data, zoals forum_id.
Oke, alles is omgezet en het werkt perfect, bedankt voor je hulp bij dit probleem, als had ik de uiteindelijke oplossing ook wel zelf kunnen bedenken |:(. Maar goed...

=( Protected by witchcraft )=

Pagina: 1