[MYSQL] startpagina query

Pagina: 1
Acties:

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Ok, ik heb een tabel met de categorien en een tabel met links. Nu bevat de tabel links een categorie id. Nu wil ik alle categorien en links er zodanig uithalen dat de pagina met 1 query kan worden opgebouwd.

Als een categorie geen links bevat moet de categorie wel worden afgedrukt.

Zelf had ik de volgende query:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
  c.ID AS cID,
  c.Naam AS CNaam,
  c.Kollom,
  l.Naam AS LNaam,
  l.Url,
  l.ID AS lID
FROM 
  c,l
WHERE
  c.pID='$pid' 
    AND 
  l.cID=c.ID
ORDER BY 
  c.Kollom,
  c.Rij


l staat in dit geval voor de tabel links en c voor de tabel categorien. Deze query werkt wel, alleen als een categorie geen links bevat, voldoet de categorie niet aan de WHERE clausule, omdat l.cID niet bestaat. En dus zal de categorie ookniet uitgekozen worden. Heb al het een en ander geexperimenteerd, maar ik krijg het niet goed.

[ Voor 6% gewijzigd door RSD op 14-05-2005 15:36 ]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Is het de bedoeling om van beide tabellen 1 record te selecteren? Je kunt anders beter gewoon 2 queries uitvoeren, volgens mij scheelt dat niet zo veel in tijd. Of je moet de 2 tabellen samenvoegen en eens serieus nadenken over wat voor abstractie je nu uit de tabel probeert te trekken en dat gebruiken als naam voor die tabel. Heten de tabellen verder serieus c en l? Er bestaat ook zoiets als een alias voor het specificeren van een tabel, net zoals je in de select clause gebruikt. Laatste optie is trouwens om een left join uit te voeren, maar dan zijn alle l waarde gelijk aan null als er geen link bestaat die voldoet aan de where clause.

Noushka's Magnificent Dream | Unity


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Ze heten serieus c en l, daarnaast worden meerdere records getoond, dus alle categorien van die pagina inclusief de bijbehorende links.

Hoe werkt dat met die left join dan, heb er wel vaker van gehoord, maar nog niet echt serieus naar gekeken, omdat ik het niet echt begreep?

[ Voor 23% gewijzigd door RSD op 14-05-2005 15:47 ]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 
  c.ID AS cID,
  c.Naam AS CNaam,
  c.Kollom,
  l.Naam AS LNaam,
  l.Url,
  l.ID AS lID
FROM 
  categorie c LEFT JOIN link l ON l.cID=c.ID
WHERE
  c.pID='$pid' 
ORDER BY 
  c.Kollom,
  c.Rij

Zo ongeveer. Nu worden alle records geselecteerd welke voldoen aan de where clause, en mocht de left join niet voldoen, dan zijn alle niet geselecteerde velden gelijk aan null.

Ik kan je overigens sterk aanraden om je tabellen een normale naam te geven. Is 4 seconden extra typ werk, maar maakt het geheel wel een stuk begrijpelijker een leesbaarder.

[ Voor 63% gewijzigd door Michali op 14-05-2005 15:52 ]

Noushka's Magnificent Dream | Unity


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Waarom heb je er nu categorie bij staan? Het werkt volgens mij wel zo... :-) maar is dit ook sneller of kan ik beter 2 queries gebruiken, dus eerst de categorie ophalen en dan in while loop nog een query die bij elke categorie de links ophaalt.

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Als het mogelijk is dat er geen links zijn, dan zou ik gewoon 2 queries doen. Je kunt eventueel even benchmarken als je de snelheid niet vertrouwt, maar met zulke simpele queries zou ik me daar niet druk om maken. Die categorie is om je over te halen je tabellen te hernoemen :P

Noushka's Magnificent Dream | Unity


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Dus een query in een while lus? Als de pagina 10 categorieen bevat, dan heb je al 11 queries, per pagina oproep. En je moet er ook nog eens vanuit gaan dat de database wel eens gigantisch vol kan worden.

[ Voor 29% gewijzigd door RSD op 14-05-2005 16:04 ]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Doe eens een benchmark zou ik zeggen. Je kunt gewoon wat test data invoeren en dan je mogelijkheden testen. Als je denkt dat die enkele query veel sneller is, en je hebt geen probleem met de implementatie, dan kun je hem gewoon toepassen als je wilt. Lijkt mij ook geen probleem verder.

Noushka's Magnificent Dream | Unity


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Ok, bedankt!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19:18

Robtimus

me Robtimus no like you

edit:
never mind, niet goed gelezen

[ Voor 95% gewijzigd door Robtimus op 14-05-2005 16:42 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

RSD schreef op zaterdag 14 mei 2005 @ 15:55:
Waarom heb je er nu categorie bij staan? Het werkt volgens mij wel zo... :-) maar is dit ook sneller of kan ik beter 2 queries gebruiken, dus eerst de categorie ophalen en dan in while loop nog een query die bij elke categorie de links ophaalt.
Dit is waarschijnlijk sneller, maar zolang de performance geen issue is, zou ik de makkelijkste manier gebruiken ipv de snelste ;) Imho is deze het makkelijkst trouwens, tenzij je meer met je data wilt doen.
Pagina: 1