[mySQL] SELECT sorteren, maar lastig dbmodel

Pagina: 1
Acties:

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 23:18
[PHP/mySQL]

Ik heb de volgende tabel

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE `tbl_pages`
(
  `npaginaid` int(11) unsigned NOT NULL auto_increment,
  `nversion` int(11) unsigned NOT NULL default '1',
  `nauthorid` int(11) NOT NULL default '0',
  `ngroupid` int(11) NOT NULL default '0',
  `sname` varchar(255) NOT NULL default '',
  `scontents` text NOT NULL,
  `ntimestamp` int(11) NOT NULL default '0',
  `npublished` tinyint(1) unsigned NOT NULL default '0',
  `narchived` tinyint(1) unsigned NOT NULL default '0',
  `ndeleted` tinyint(1) unsigned NOT NULL default '0',
  `nhits` int(11) unsigned NOT NULL default '0',
  
  PRIMARY KEY  (`npaginaid`,`nversion`),
  UNIQUE KEY `npaginaid` (`npaginaid`,`nversion`),
  KEY `npaginaid_2` (`npaginaid`,`nversion`,`nauthorid`,`ngroupid`)
) TYPE=MyISAM;


Dit is de tabel voor het opslaan van pagina's (met hun versies).
BV. Pagina met "npaginaid" 1 en "nversion" 1. Nieuwe versie: pagina met "npaginaid" 1 en "nversion" 2. Aan de hand van het gegeven dat "npaginaid" hetzelfde is, weet ik dat het om dezelfde pagina gaat.

Nu moet ik ook de gegevens gesorteerd kunnen weergeven, zowel op "sname" (naam van pagina) als "ntimestamp" (aanmaaktijd van pagina versie).


Het gaat erom dat ik een overzicht kan genereren van de nieuwste paginaversies (dus van alle pagina's de laatste versie), en deze gesorteerd op óf "sname" óf op "ntimestamp", met een offset van N van het begin.

Nu heb ik zelf het idee dat dit niet in 1 query kan. Daarom was ik van plan om eerst alle nieuwste versies op te halen:
SQL:
1
2
SELECT npaginaid, MAX(nversion) AS nversion FROM tpl_pages
GROUP BY npaginaid LIMIT {offset N}, 5;


Dit geeft het gewenste resultaat. Maar nu wil ik in volgende query's de betreffende pagina's ophalen (door middel van een loop in de programmacode (PHP, BTW).
SQL:
1
2
SELECT * FROM tpl_pages
WHERE npaginaid = {npaginaid} AND nversion = {nversion} LIMIT 1;

({var} uit vorige query)

Allemaal leuk en aardig, maar niet gesorteerd. Met een simpele ORDER BY in de eerste query, gaat het niet goed.

Nu is de vraag dus: Hoe krijg ik het resultaat gesorteerd? De goede query(s)? Tips voor het dbmodel?

No amount of key presses will shut off the Random Bug Generator


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Hoe ziet je sort query (dus icm ORDER BY) er uit?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • BHR
  • Registratie: Februari 2002
  • Laatst online: 23:18
SQL:
1
2
3
SELECT npaginaid, MAX(nversion) AS nversion FROM tpl_pages
ORDER BY {veld} {asc/desc} 
GROUP BY npaginaid LIMIT {offset N}, 5;


Maar de order by slaat niet op dezelfde records/gegevens als de group by

[ Voor 25% gewijzigd door BHR op 10-10-2003 09:01 ]

No amount of key presses will shut off the Random Bug Generator


  • BHR
  • Registratie: Februari 2002
  • Laatst online: 23:18
Ik heb het opgelost:
SQL:
1
2
3
4
5
6
7
8
9
CREATE TEMPORARY TABLE IF NOT EXISTS tbl_pages_tmp () 
SELECT npaginaid, MAX(nversion) AS nversion 
FROM tbl_pages GROUP BY npaginaid LIMIT 0, 15;

SELECT t1.* FROM tbl_pages AS t1, tbl_pages_tmp AS t2 
WHERE t1.npaginaid = t2.npaginaid AND t1.nversion = t2.nversion 
ORDER BY t1.npaginaid ASC;

DROP TEMPORARY TABLE IF EXISTS tbl_pages_tmp;

[ Voor 4% gewijzigd door BHR op 10-10-2003 10:50 ]

No amount of key presses will shut off the Random Bug Generator