Springen naar inhoud


- - - - -
Solved

Sqlite Query



  • Log in a.u.b. om te beantwoorden
Er zijn 6 reacties in dit onderwerp

#1 thijs

thijs

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 539 berichten
    Laatst bezocht 19 sep 2016 20:53
  • LocatieOude Tonge

Geplaatst op 07 april 2015 - 19:46

Dag VBIB'ers,

Ik hoop dat jullie me hiermee kunnen helpen.

Ik heb een tabel in een database met een tweetal relevante kolommen voor deze kwestie: 'aantal' en 'catid'.

Ik wil graag eerst de tabel desc sorteren op de waarde in 'aantal', vervolgens de eerste x aantal rijen pakken.
Vervolgens wil ik deze regels sorteren op 'catid', met eventuele second sort op 'aantal'.

Ik kom er tot nu toe nog niet echt uit. Zou iemand me hiermee kunnen helpen?

Groeten!
Thijs

#2 josk79

josk79

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 614 berichten
    Laatst bezocht 16 aug 2018 17:25

Geplaatst op 07 april 2015 - 19:56

Zoiets?

Code:
SELECT * FROM tbl ORDER BY aantal DESC, catid ASC LIMIT 10

Deze haalt de eerste 10 resultaten op

#3 thijs

thijs

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 539 berichten
    Laatst bezocht 19 sep 2016 20:53
  • LocatieOude Tonge

Geplaatst op 07 april 2015 - 20:19

Ja helemaal!
Ik ben veel te ingewikkeld aan het denken met JOIN functies enzo, bedankt! ;)

Slotje

#4 thijs

thijs

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 539 berichten
    Laatst bezocht 19 sep 2016 20:53
  • LocatieOude Tonge

Geplaatst op 07 april 2015 - 23:25

Sorry, is'm toch nog niet!

Ik zal proberen even het probleem wat anders te verwoorden.

In een tabel gesorteerd op kolom 'aantal' pak ik de eerste, zeg, 10 rijen.

Vervolgens sorteer ik deze 10 rijen op kolom 'catid'. De tabel moet dus echt twee keer opnieuw worden gesorteerd.

De oplossing die je aandroeg nam inderdaad eerst de eerste tien, en sorteerde die op 'aantal', wanneer er twee regels waren met dezelfde waarde in 'aantal' werd er gesorteerd op 'catid'.

@Josk: je hebt de website gezien. Het is de bedoeling dat op de voorpagina van de aanvragen en aanbiedingen slechts de populairste x aantal items wordt getoont, zo dat ze op categorie zijn gesorteerd. Nu is het mogelijk dat een categorie twee keer voorkomt, ik denk dat je dat zelf hebt getest door 245234523452345 maal een talent maaien 2 toe te voegen ;p (ik krijg een mailtje voor ieder talent dat wordt toegevoegd haha). Dat is alleen niet de bedoeling. Dus stel het volgende:

Naam      |    aantal    |   catid
Adv 1              10              1
Adv 2              12              2
Adv 3              13              5
Adv 4              1                1
Adv 5              100            1
Adv 6              9                2

Als ik de populairste 4 items wil laten zien, moet het dus als volgt worden weergegeven, gesorteerd op [catid, aantal]

Cat 1
Adv 5
Adv 1

Cat 2
Adv 2

Cat 5
Adv 3



Kan iemand hier iets mee?

Groeten!
Thijs

#5 ArComAr

ArComAr

    VBIB Godfather

  • Leden
  • PipPipPipPipPipPipPipPip
  • 3788 berichten
    Laatst bezocht 04 mei 2018 13:52

Geplaatst op 08 april 2015 - 09:06

Ik weet niet wat het beste gaat zijn tussen de opbouw doen van de categorieën in code, of specifiek je data in die volgorde laten terug komen uit je database.

Wat ik bedoel met in code, is dat je je layout opbouw met de categorieën in code laat gebeuren. Je selecteert dan de top 4 items ordered by aantal uit de database, en dan loop je over deze data en vul je een dictionary/collection op adh van de catId.

Gezien de php fout dat in het testen topic wordt vermeld, vermoed ik dus dat je werkt met php. Je zou dan een associative array kunnen opbouwen met de catId:
Code met de losse hand geschreven:
Code:
$result = array();
foreach (dbCollection as $item)
{
   $result[$item->catId][] = $item;
}

Op deze manier hoef je dan daarna enkel nog te printen.


Wil je je data uit je database in dit formaat laten terugkomen, dan kan je dit op deze manier doen:
Code:
select *
from (select top 4 * from tabel order by aantal desc) as tabel2
order by catid asc, aantal desc


Dit is wel getest met een sql server database. Ik heb geen mysql of andere om op te testen op dit moment. Vermoedelijk ga je een mysql hebben waar bij je "limit" ipv "top" gaat moeten gebruiken.

Afhankelijk van hoe goed je hosting is van performantie en hoeveel drukte je verwacht op de website, ga je wel wat performantie testen moeten doen. Een loop in code is maar enkele cpu cycles, maar je moet er wel 2 doen (eentje om je data juist te zetten en eentje om ze te printen op het scherm) om het gedaan te krijgen. Data opvragen uit je database dmv subqueries is dan weer zeer intensief door het aantal scans en seeks dat er gaat gebeuren. Als je de performantie van dit wil, ga je een executionplan moeten laten genereren, maar hoe je dat specifiek bij mysql doet weet ik ook niet.

Tot slot: het maakt totaal niet uit welke methode je gebruikt als het weinig data is, weinig simultane bezoekers en een degelijke hosting.

#6 thijs

thijs

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 539 berichten
    Laatst bezocht 19 sep 2016 20:53
  • LocatieOude Tonge

Geplaatst op 08 april 2015 - 10:09

Bedankt voor je antwoord! Ga ik even mee aan de slag!
'k Werk inderdaad met PHP, had ik niet vermeld inderdaad.

Groeten!

#7 thijs

thijs

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 539 berichten
    Laatst bezocht 19 sep 2016 20:53
  • LocatieOude Tonge

Geplaatst op 08 april 2015 - 10:38

Yess ik geloof dat het werkt. Bedankt beide!





Ook met taq Solved voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[Solved] Untitled 1

Met dank aan Jürgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)