[MySQL 3.23/(php)] Count(*) as c, 'rownr' as n where ....

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Voor een paging systeem wil ik weten hoeveel records de database teruggeeft bij een bepaalde query, dat doe ik dus zo:
code:
1
 select count(*) as c form producten where producttype='4'

Dat werkt dus prima. Maar ik wil ook het volgende weten:
het product met het ID=143 (bijvoorbeeld). Als hoeveelste rij komt deze terug als ik de query echt zou uitvoeren. (en komt hij er uberhaupt in voor?)
code:
1
 select id, naam,prijs, from producten where producttype='4'

Nu zou ik dit kunnen oplossen door eerst alle id's op te halen en dan met php te kijken de hoeveelste row het is. Maar mijn sql-statements bevatten ook order by clauses. dus zal ik die velden ook mee moeten opvragen anders werkt de order by niet... Dat levert dus nogal wat extra databasewerk op.
Dus ik vroeg mij af of iemand weet of dit rechtstreeks met sql mogelijk is, dus in pseudo sql
code:
1
select n-th row as rownr from producten where  id='4' when producttype='4' and ordered by naam


Op dit moment is het nog MySQL 3.23 maar ik heb de mogelijkheid om naar MySQL 4.01 over te stappen.

Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Pfoe, hoe zat dat ook alweer.

Ik heb wel gehoord van de functie SQL_CALC_FOUND_ROWS() die je misschien kunt gebruiken voor het een en ander.

Rustacean


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Lijkt me niet mogelijk, helaas :)

In oracle zou je zoiets kunnen doen:
select rownr, naam from (select .. je query zonder where, met order) where id = 4;

Maar mysql (ook 4.1) kent, bij mijn weten, geen rownummer contructie.

Als je het echt niet in je client-app wilt kan het wel met zoiets:
SQL:
1
2
3
4
5
6
7
8
9
10
create temporary (heap) table tempstub (
rownum integer auto_increment,
id integer ...,
naam varchar ...,
prijs numeric ...
KEY (id)
);
INSERT INTO tempstub VALUES (id, naam, prijs) SELECT id, naam,prijs 
    from producten ORDER BY naam;
SELECT rownum, id, naam, prijs FROM tempstub WERE id = 4;

[ Voor 48% gewijzigd door ACM op 17-04-2003 19:50 ]


Acties:
  • 0 Henk 'm!

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 16-09 09:38

Goodielover

Only The Best is Good Enough.

De enige manier om dit te doen is eerst je query op te stellen met de order by.
Dan breid je het statement uit door dezelfde selectie te doen, maar dan die select te laten resulteren in een count van alle record die kleiner zijn qua sortering telt.

dus
code:
1
2
3
4
select t1.id, t1.veld1, t1.veld2,... count(t2.id) as volgorde
from   tabel t1, tabel t2
where t1.id >= t2.id
group by t1.id

Deze levert je dus een volgorde getal op bij je record

Ik heb nu de ID gebruikt maar je kan ook een combinatie van andere velden gebruiken. Daar wordt het dan wel iets ingewikkelder van, maar principe is gelijk.

[ Voor 16% gewijzigd door Goodielover op 18-04-2003 23:51 ]


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Goodielover schreef op 18 april 2003 @ 23:50:
De enige manier om dit te doen is eerst je query op te stellen met de order by.
Dan breid je het statement uit door dezelfde selectie te doen, maar dan die select te laten resulteren in een count van alle record die kleiner zijn qua sortering telt.

dus
code:
1
2
3
4
select t1.id, t1.veld1, t1.veld2,... count(t2.id) as volgorde
from   tabel t1, tabel t2
where t1.id >= t2.id
group by t1.id

Deze levert je dus een volgorde getal op bij je record

Ik heb nu de ID gebruikt maar je kan ook een combinatie van andere velden gebruiken. Daar wordt het dan wel iets ingewikkelder van, maar principe is gelijk.
Mmmm, in ieder geval een volgordenummer...,
maar dat kan eenvoudiger herinner ik me nu weer...
MySQL:
1
2
set @rownum := 0;
select @rownum := @rownum + 1 as volgorde, id , naam, cat_id from producten where cat_id=4 order by naam


Ik moet toch maar eens MYSQL 4 gaan installen, misschien dat ik dit dan als subselect kan gebruiken.....
code:
1
select volgorde, id from (....vorige query....) where id=134


Mmmmmm..... :9

Acties:
  • 0 Henk 'm!

  • Kama
  • Registratie: Mei 2002
  • Laatst online: 30-06 10:52

Kama

Game Coordinator

kun je niet het resultaat van de query in een nieuwe table/view dumpen met een autonumbering? en dan in die view/table zoeken naar die ID...

drs. Kama

Pagina: 1