[MySQL] Laatste vijf advertenties van meerdere rubrieken

Pagina: 1
Acties:

  • Bartistuta
  • Registratie: Juli 2001
  • Laatst online: 10:14
Hallo, ik zit met een probleem met een SQL query.
Het zit zo...
Ik heb 3 verschillende tabellen: categorie, rubriek en advertentie.
Ik heb bijv een categorie Auto's. Nu heeft deze categorie meerdere rubrieken (bijv Mercedes, BMW etc). Ik heb in de tabel rubriek het id van de categorie waar die rubriek bij hoort opgeslagen.
Dan komen we bij advertentie. Bij een advertentie wordt ook het id van een rubriek opgeslagen.
Dit komt er dus bijv zo uit te zien:

TABEL CATEGORIE:
ID - NAAM
1 - Auto

TABEL RUBRIEK
ID - CATEGORIE - NAAM
1 - 1 - Mercedes
2 - 1 - BMW
3 - 1 - Fiat

TABEL ADVERTENTIE
ID - BESCHRIJVING - DATUM - RUBRIEK
1 - bla - 2005-04-23 - 1
2 - abc - 2005-04-23 - 1
3 - asd - 2005-04-23 - 2
4 - hdj - 2005-04-24 - 2
5 - jhj - 2005-04-26 - 2
6 - ooi - 2005-04-26 - 3

Zoals je ziet horen advertenties 1 en 2 bij de rubriek mercedes.

Nu wil ik een query maken die het volgende ophaalt:
De laatste vijf advertenties van elke rubriek voor een bepaalde categorie.
Dat je dus het volgende krijgt.
Je kiest voor Auto's. Dan worden alle rubrieken getoond met de laatste vijf advertenties.
Iemand die hiermee kan helpen? Is het mogelijk dit in 1 query te doen, of moet dit in meerdere queries? Ik gebruik PHP om de gegevens op te halen en geef dus zo door welke categorie het is...

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Kijk eens naar INNER JOIN en LIMIT.

* NMe aait Creepy terug. O+

[ Voor 36% gewijzigd door NMe op 26-04-2005 13:42 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Met een dubbele join is het vrij simpel om per categorie alle advertenties op te halen. Vervolgens een limit en een order by gebruiken en je bent klaar :)

Dus ja, het is in 1 query te doen. Je zult hiervoor een join moeten gebruiken. Een beetje SQl tutorial legt je wel uit hoe je joins kan gebruiken.

Ps. bekijk voor een volgende topicstart P&W FAQ - De "quickstart" even. Ik mis nog wat zaakjes in je startpost zoals wat je nu zelf al hebt geprobeerd en wat daar niet mee lukte.

* Creepy aait -NMe-

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • dajappie
  • Registratie: Januari 2005
  • Laatst online: 15:30
Wat heb je zelf al geprobeerd? Draait het op MySQL? En welke versie? 3.x, 4.0.x, 4.1.x kan uitmaken qua mogelijkheden.

Je kan het jezelf heel makkelijk maken en een tabelletje bijhouden met de laatste 5 reacties per categorie, bespaart jezelf een mogelijk zware query die je vaak moet draaien, een enkele update als er een nieuw item bijkomt is denk ik minder belastend.

  • Bartistuta
  • Registratie: Juli 2001
  • Laatst online: 10:14
Ik had zelf de volgende query gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
    advertentie.rubriek, advertentie.beschrijving, advertentie.prijs 
FROM 
    advertentie 
INNER JOIN 
    rubriek 
ON 
    advertentie.rubriek=rubriek.id 
WHERE 
    rubriek.categorie = ? 
ORDER BY 
    advertentie.plaatsdatum 
LIMIT 5

Het probleem hierbij is dat ik niet van elke rubriek de laatste vijf krijg, maar ik krijg in totaal maar vijf advertenties terug. Ik weet niet zo goed hoe ik per rubriek dus vijf advertenties terug kan krijgen.

Ik draai MySQL 4.1.11

  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 15:51
Je wilt een maximum aantal resultaten per key.
Hierover heb ik eea nagezocht en dit kun je terugvinden in: [rml][ SQL] Maximum aantal rows per unieke FK[/rml]

Helaas was er niemand die inhoudelijk (uberhaupt) op mijn voorstel reageerde. Misschien dat je er wat aan hebt. Laat het dan even weten :)

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Ok, blijkbaar dachten -NMe- en ik iets te simpel :)
Ik dacht dat je de 5 laatste advertenties per categorie wilde hebben, en niet, de laaste 5 advertenties per rubriek voor elke rubriek (in 1 query).

Ik denk dat er niets anders op zit om per rubriek een query met limit te gaan stellen.

offtopic:
* Creepy aait P_de_B ;)

[ Voor 7% gewijzigd door Creepy op 26-04-2005 14:13 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Dit kan toch vrij eenvoudig met een subquery?

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT 
    advertentie.rubriek, advertentie.beschrijving, advertentie.prijs 
FROM 
    advertentie a1
INNER JOIN 
    rubriek r1
ON 
    advertentie.rubriek=rubriek.id 
WHERE 
    a1.id IN
    ( SELECT id
      FROM advertentie a2
      WHERE a2.rubriek= a1.rubriek
      ORDER BY plaatsdatum DESC
      LIMIT 5
    )      
ORDER BY 
    advertentie.plaatsdatum 


o ja, ik ga er trouwens van uit dat je de laatste 5 wilt, dus vandaar de plaatsdatum DESC in de order by.

[ Voor 11% gewijzigd door bigbeng op 26-04-2005 14:20 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

bigbeng schreef op dinsdag 26 april 2005 @ 14:19:
Dit kan toch vrij eenvoudig met een subquery?

SQL:
1
query 


o ja, ik ga er trouwens van uit dat je de laatste 5 wilt, dus vandaar de plaatsdatum DESC in de order by.
Let dan wel op dat subqueries pas goed werken vanaf een bepaalde MySQL versie, ik geloof 4.1.18 oid. Het kan dus zijn dat je voor die query eerst je MySQL versie moet updaten. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Creepy schreef op dinsdag 26 april 2005 @ 14:12:

offtopic:
* Creepy aait P_de_B ;)
O+ :>

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Bartistuta
  • Registratie: Juli 2001
  • Laatst online: 10:14
nescafe schreef op dinsdag 26 april 2005 @ 14:00:
Je wilt een maximum aantal resultaten per key.
Hierover heb ik eea nagezocht en dit kun je terugvinden in: [rml][ SQL] Maximum aantal rows per unieke FK[/rml]

Helaas was er niemand die inhoudelijk (uberhaupt) op mijn voorstel reageerde. Misschien dat je er wat aan hebt. Laat het dan even weten :)
Ik zal hier eens even naar gaan kijken, maar dit ziet er niet zo simpel uit.
bigbeng schreef op dinsdag 26 april 2005 @ 14:19:
Dit kan toch vrij eenvoudig met een subquery?

SQL:
1
Query


o ja, ik ga er trouwens van uit dat je de laatste 5 wilt, dus vandaar de plaatsdatum DESC in de order by.
Deze query werkt idd niet bij mij. Geeft de volgende error:
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

Zal MySQL eens even updaten om te kijken of ie het dan wel doet. Laat het nog even weten :)

[edit]
De laatste versie die ik op http://dev.mysql.com/downloads/mysql/4.1.html vind is 4.1.11, waar kan ik 4.1.18 vandaan halen?

[ Voor 13% gewijzigd door Bartistuta op 26-04-2005 14:32 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
-NMe- schreef op dinsdag 26 april 2005 @ 14:24:
[...]

Let dan wel op dat subqueries pas goed werken vanaf een bepaalde MySQL versie, ik geloof 4.1.18 oid. Het kan dus zijn dat je voor die query eerst je MySQL versie moet updaten. :P
Volgens de manual vanaf 4.1 als ik het mij goed herinner en de TS zit daar al na :P

@TS: deze query was ongetest, meer bedoeld om je in de goede richting te helpen. :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

bigbeng schreef op dinsdag 26 april 2005 @ 14:30:
Volgens de manual vanaf 4.1 als ik het mij goed herinner en de TS zit daar al na :P
Ik kwam net in de developer forums van MySQL zelf een aantal topics tegen waarin stond dat sommige subqueries niet meteen al in 4.1 werkten. :)

@TS: ik weet niet zeker of dat versienummer, 4.1.18, klopt. Het zou best kunnen dat 4.1.11 de nieuwste is, en dat die query gewoon nog niet mogelijk is in MySQL. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1