[MySQL/PHP] Selecteer 10 records van meerdere categorieen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Speedener
  • Registratie: September 2000
  • Laatst online: 18-09 12:54
Op dit moment heb ik een database met twee tabellen, 1 met categorien en 1 met subcategorien.

Wat de bedoeling is, is dat er een lijst komt met de categorieën en onder elke categorie komen 10 (op volgorde of random maakt even niet uit) subcategorien te staan, en als het er minder dan tien zijn dan gewoon minder.

Op dit moment haal ik eerst alle categorien op. En daar ga ik doorheen met een while en per while-loop doe ik een query naar de subcategorien met een LIMIT 0,10. Dat gaat prima. Maar ik ben op dit moment aan het normaliseren en het lijkt me dat dit toch wel een zware manier is en dat het makkelijker moet kunnen. Nu heb je voor 10 categorien + subcategorien; 11 Querys nodig...

Ik heb al zitten kijken of ik dan gewoon met een mooie JOIN het in 1 query kan gooien. Maar ik loop steeds op tegen het feit dat ik maar 10 subcategorien wil hebben per categorie.

Zijn er mooie oplossingen hiervoor? of is wat ik heb het beste?

LG Therma V Split WP: HU143MA.U33-HN1636M NK5


Acties:
  • 0 Henk 'm!

  • Orion84
  • Registratie: April 2002
  • Laatst online: 21-09 02:46

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

Subcategoriën een doornummerend id geven en in de query aangeven dat je alleen de subcats wil hebben met een ID <11 :?

Bedenk me nu dat dat natuurlijk wel minder simpel is dan ik het nu zeg, omdat je natuurlijk niet alleen maar een lijst van subcats hebt, maar groepjes die bij hoofdcats horen :X

Toch kan het wel, maar moet je dan bij elke groep de nummering opnieuw laten beginnen.

Dus:
Cat(A)
- subcat(A, 1)
-
-subcat(A, 10)
[norml]Cat(B)[/]
- subcat(B, 1)
-
- subcat(B, 10)

etc.

[ Voor 72% gewijzigd door Orion84 op 30-03-2006 19:29 ]

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


Acties:
  • 0 Henk 'm!

  • Speedener
  • Registratie: September 2000
  • Laatst online: 18-09 12:54
Daar heb ik over zitten denken, maar wat nou als het gaat om 100 tot 120 categorien en 1000 tot wel 10000 subcategorien? die ben je op dat moment wel allemaal aan het selecteren. (ik had dit even in mijn openingspost moeten zeggen.

LG Therma V Split WP: HU143MA.U33-HN1636M NK5


Acties:
  • 0 Henk 'm!

  • Pete
  • Registratie: November 2005
  • Laatst online: 07-09 17:51
Heb je al geprobeerd met subqueries te werken?

code:
1
2
3
4
SELECT subcategorie categorie 
FROM subcategorien 
LEFT JOIN categorien cat ON (subcategorien.catid = categorien.id) 
WHERE subcategorie.id IN ( SELECT subcategorie.id FROM subcategorie WHERE catid = cat.id LIMIT 0,10)


Ik denk niet dat het zonder subqueries te doen is. Je kunt idd geen Limits toepassen op een gedeelte van een select (toch?)

petersmit.eu


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

phsmit schreef op donderdag 30 maart 2006 @ 21:30:
Heb je al geprobeerd met subqueries te werken?

code:
1
2
3
4
SELECT subcategorie categorie 
FROM subcategorien 
LEFT JOIN categorien cat ON (subcategorien.catid = categorien.id) 
WHERE subcategorie.id IN ( SELECT subcategorie.id FROM subcategorie WHERE catid = cat.id LIMIT 0,10)


Ik denk niet dat het zonder subqueries te doen is. Je kunt idd geen Limits toepassen op een gedeelte van een select (toch?)
Noch kun je LIMIT gebruiken in subqueries. ;)

'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.


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Zolang je iets genummerds hebt in je tabel subcategorien kan het toch gewoon met een LEFT JOIN met een extra clausule:
SQL:
1
2
3
4
5
6
7
SELECT
  c.category, sc.subcategory
FROM 
  category AS c 
LEFT JOIN 
  subcategory AS sc 
ON (s.categoryid = sc.categoryid AND sc.subcategoryid < 11)

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dan krijg je alle subcategoriën met een ID onder de 11. Als je nou de subcategoriën 2 t/m 4 gehad hebt, maar later verwijderd hebt, dan krijg je dus alleen de categoriën 1 en 5 t/m 10 terug. Lijkt me niet helemaal wat de TS vroeg.

Hoe het dan wel moet zie ik zo snel ook even niet. Beetje te duf voor nu. :+

'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.


Acties:
  • 0 Henk 'm!

  • Speedener
  • Registratie: September 2000
  • Laatst online: 18-09 12:54
Zo heb ik dus ook tijden zitten klooien, maar ik kwam erachter dat ik met mijn huidige MySQL kennis er niet uit kwam. En 10000 records ophalen en dan verwerken vond ik een beetje heftig...

LG Therma V Split WP: HU143MA.U33-HN1636M NK5


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
-NMe- schreef op donderdag 30 maart 2006 @ 23:19:
Dan krijg je alle subcategoriën met een ID onder de 11.
Daar heb je een punt, subcategorie-id's zullen natuurlijk sowieso doortellen over alle categorien heen waardoor - mochten je id's al netjes oplopen - het geheel alleen werkt voor de eerste categorie. Maar goed, het punt was eigenlijk dat je op de plaats van die "subcategoryid < 11" conditie een truc moet toepassen op een numeriek veld dat terugleidt naar max 10 records. Wellicht bieden de MySQL math functies daar wat hips voor.
Mocht dat niet mogelijk zijn zou ik zelf overigens waarschijnlijk voor een complete LEFT JOIN gaan en in PHP filteren om er max 10 over te houden. Je hebt dan wat overhead op de opgehaalde data, maar die is (tenzij je honderden subcategorien hebt per categorie) lager dan de extra tijd die het uitvoeren van een query of -tig tot gevolg zou hebben.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • sQuarecoW
  • Registratie: Juli 2003
  • Laatst online: 19-09 18:07
beetje vies.. maar je kunt ze toch allemaal halen en dan in je PHP er maar max 10 verwerken?

Acties:
  • 0 Henk 'm!

Verwijderd

De vraag is, waar worden je subcategorieen toegevoegd?
Ik neem aan in een backoffice omgeving.
Als dit het geval is, dan moet je dáár je probleem al op gaan vangen om te voorkomen dat je overhead gaat creeeren om maximaal tien subcategorieen per categorie te tonen aan de gebruiker.

Ik stel voor dat er in de tabel subcategorieen een extra boolean veld komt genaamd `last_ten` of iets degelijks. Als er nu een subcategorie toegevoegd wordt in de backoffice omgeving dan zorg je ervoor dat er voordat de insert query uitgevoerd wordt een controle plaatsvindt waarbij gecontroleerd wordt of er voor de categorie waar je een subcategorie voor aan het toevoegen bent, al 10 subcategorieen bestaan. Als dit zo is, dan zet je het veld `last_ten` van de oudste subcategorie op false.

Vervolgens voeg je de subcategorie pas toe, waarbij de waarde van het veld `last_ten` standaard op true staat.

Op deze wijze heb je alle subcategorieen die je straks wilt gebruiken een unieke eigenschap gegeven, namelijk het veld `last_ten` dat de waarde true heeft als ze geselecteerd mogen worden.
Nogmaals, dit probleem dien je dus op te lossen voordat er uberhaubt data geseleceerd gaat worden, en wel op het moment dat je de subcategorieen gaat aanpassen (d.w.z., als er een subcategorie toegevoegd wordt).

Als je geen mogelijkheid hebt om de situatie waterdicht vóóraf op deze manier op te lossen, dan moet je terugvallen op je huidige situatie, namelijk die waar overhead gevormd wordt. Op zich is een dergelijke situatie niet heel erg, want een paar simpele select-queries gaan je applicatie echt geen seconden trager maken.. Succes.

[ Voor 217% gewijzigd door Verwijderd op 31-03-2006 13:10 ]

Pagina: 1