[MySQL] sql query problemen

Pagina: 1
Acties:

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 15-09 08:37
hoi,

ben bezig met het maken van een forum als project. nu zit ik een beetje vast met een sql query wat zut uit verschillende tabellen moet ophalen.

dat ding moet de forumnaam, omschrijving, aantal posts, aantal topics en datum van laatste posting ophalen.
op dit moment zijn het # posts en # topics nog als db veld in de forum table. ik weet namelijk niet hoe het met de performance van select count zit als je duizenden records hebt.

de select query die ik al heb:

recset2=conn.Execute("SELECT forums.posts, forums.id, forums.forum, forums.omschrijving, forums.topics FROM forums WHERE forums.groep_id = "+recset("id")+" AND forums.zichtbaar = 1 ORDER BY forums.plaats ASC");

nou moet ik 'postdatum' uit de table replies hebben met het hoogste id.

nou heb ik de volgende query bedacht:

SELECT replies.postdatum, forums.posts, forums.id, forums.forum, forums.omschrijving, forums.topics FROM forums,replies WHERE forums.groep_id = 3 AND forums.zichtbaar = 1 AND replies.id = last_insert_id() ORDER BY forums.plaats ASC


tot zover werkt het ok in een sql client. ik krijg netjes de rows terug die ik wil hebben inclusief de laatste datum.

copy/paste ik de sql rechtstreeks in m'n asp source code dan geeft tie geen enkele row terug :? , terwijl mascon mysql client de goeie rows terug geeft. iemand een idee?

is het trouwens zo dat select count zwaar je systeem belast. de manier is nu namelijk dat ik in de table forum een record bij houd wanneer er een reply / topic gepost word. dit is nou niet echt efficient. hoe doen ze dat hier op de frontpage van GoT?

  • Femme
  • Registratie: Juni 1999
  • Laatst online: 15:44

Femme

Hardwareconnaisseur

Official Jony Ive fan

Hier op GoT worden de tellertjes en tijden bijgehouden in de forum tabellen.

count() op myisam tabellen zonder where clause is ultrasnel aangezien hij het getal dan uit de table statistics haalt (InnoDB doet dat niet, maar gaat echt records tellen). Tellen met where clausule gaat ook nog wel snel zolang je tegen een index telt en die index niet al te groot is.

Bijv.:
code:
1
2
3
4
5
6
7
mysql> SELECT count(*D FROM reakties WHERE UserID=1;
+----------+
| count(*D |
+----------+
|     2567 |
+----------+
1 row in set (0.00 sec)

Is toch een tabel (in dit geval InnoDB) met 411.000 reacties.

Maar ik zou dit soort dingen liever niet realtime doen. Als je de datums van de laatste post en de counter bijhoudt in de forumtabel kun je de index pagina simpeler en sneller naar boven toveren. Dat is wel wenselijk bij een druk bezocht forum waar honderden users op de frontpage staan te rammelen.

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 15-09 08:37
thx :)

ik ga wat benchmarks ermee doen. eerst maar is goeie sql queries in elkaar zetten. :)

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 15-09 08:37
ik haal mijn topic ffies omhoog heb nog vraag n.l.

uit de table replies wil ik de replies trekken met de hoogste datum waarden, dus de laatst geposte replies.

er zit een column postdatum die de datum van de reply bevat.

nu wil ik de replies ophalen die het laatst zijn gepost (en dus het dichtst bij de huidige datum liggen (iets met mysql function NOW() ?).

later moet daar nog een limiet van 7 dagen oud en een LIMIT van max 100 topics per page aantoegevoegd worden maar dat is niet zo'n probleem.

nu is de vraag hoe doe ik dat :?. heb de doc's van mysql.com doorgespit maar daar is het helaas niet echt duidelijk hoe..

Verwijderd

met MAX()

?

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 15-09 08:37
Op donderdag 06 december 2001 00:55 schreef woeitje het volgende:
met MAX()

?
w00t. dat is het jorgen.

thx :7

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 15-09 08:37
dit is een wazig probleem:

hier de volgende (versimpelde) query die ik gebruik om topics op tehalen op een forum.
code:
1
recset=conn.Execute("SELECT topics.topic, MAX(replies.postdatum) FROM topics,replies GROUP BY topics.topic ORDER BY replies.postdatum DESC");

als antwoord krijg ik terug: 2001-12-23 23:08:22
als ik dit in een date() stop dan kan dat niet omdat het formaat niet klopt :?

als ik dan een response.write doe van die var krijg ik NaN.
als ik echter de volgende query uitvoer:
code:
1
2
3
4
recset=conn.Execute("SELECT MAX(replies.postdatum) FROM replies");

var testje = new Date(recset("MAX(replies.postdatum)"));
Response.write(testje);

dan is de output: Sun Dec 23 23:08:22 UTC 2001

en zo moet ik de date dus ook hebben.
waarom wordt de datum in korte datum notering weergeven bij de eerste query? heel wazig :(

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 15-09 08:37
*schop*

iemand moet het toch wel weten ?
Pagina: 1