Non sono molto sicuro se il titolo Counter group level rende perfettamente l'idea dell'argomento. Comunque, l'obiettivo è quello di ottenere una colonna contatore per ogni gruppo ossia al cambiare del valore di una determinata colonna il contatore dovrà ripartire da 1. Inoltre applicheremo anche un filtro al fine di estrapolare solo i primi 3 documenti più recenti per ogni categoria. Nell'esempio ho utilizzato il db di joomla ed in particolare la tabella content e categories.
Partiamo subito dal risultato.
Come noterete ogni categoria contiene al massimo 3 articoli e "Running" è una colonna calcolata su cui possiamo applicare un filtro.
title | id | Created | catid | title | Running |
---|---|---|---|---|---|
MySQL Counter group level | 106 | 2010-09-25 14:20:36 | 35 | SQL | 1 |
Limit in subquery | 105 | 2010-09-25 01:42:32 | 35 | SQL | 2 |
SQL Replace String | 104 | 2010-09-21 12:52:04 | 35 | SQL | 3 |
Data Grid and more | 62 | 2010-07-10 10:56:51 | 36 | PHP | 1 |
PHP - DOCUMENT_ROOT | 49 | 2010-06-29 13:10:41 | 36 | PHP | 2 |
Youtube scaricare video | 103 | 2010-09-18 15:27:26 | 37 | System | 1 |
Combinazione di Tasti | 102 | 2010-09-16 07:09:20 | 37 | System | 2 |
Auto Autenticarsi | 100 | 2010-09-10 19:38:48 | 37 | System | 3 |
Syntax Highligher | 70 | 2010-07-29 23:10:29 | 39 | Joomla | 1 |
RokAjaxSerch and Ja_Purity_ii | 69 | 2010-07-29 20:18:37 | 39 | Joomla | 2 |
Purity's Typography | 56 | 2010-07-11 14:00:09 | 39 | Joomla | 3 |
Glass Bar | 71 | 2010-07-30 13:20:13 | 40 | Graphics | 1 |
Robots.txt | 98 | 2010-09-09 07:02:35 | 41 | Various | 1 |
Illusione Ottica | 97 | 2010-09-07 22:25:40 | 41 | Various | 2 |
Video Jungle | 94 | 2010-09-03 19:41:23 | 41 | Various | 3 |
Esportare xls con ADODB | 78 | 2010-08-05 16:29:25 | 42 | Lotus Notes | 1 |
Importare xls con ADODB | 77 | 2010-08-04 20:51:08 | 42 | Lotus Notes | 2 |
Lotus Notes - Edit Field | 76 | 2010-08-04 19:57:16 | 42 | Lotus Notes | 3 |
Alcune soluzioni Ajax | 91 | 2010-08-29 19:51:49 | 44 | Ajax | 1 |
Autosuggest Ajax jQuery PHP | 81 | 2010-08-07 15:27:26 | 44 | Ajax | 2 |
Ajax search con jQuery (ibm) | 80 | 2010-08-06 22:23:09 | 44 | Ajax | 3 |
Content Slider | 101 | 2010-09-13 07:15:08 | 46 | Javascript | 1 |
Lazy Load Velocizza | 96 | 2010-09-07 20:00:38 | 46 | Javascript | 2 |
Lightbox | 93 | 2010-09-03 16:09:19 | 46 | Javascript | 3 |
Ed ecco l'istruzione SQL
C'è un esperto MySQL tra voi che è in grado di spiegarmi come mai funziona? Non è uno scherzo...sono partito da un esempio di colonna contatore calcolata che avrebbe dovuto calcolare un totale di tipo Running ma a me non ha funzionato...cosi' dopo vari tentativi sono arrivato al suddetto risultato ma non ho capito bene il meccanismo.
Una cosa è certa, nella variabile @previous viene salvato l'ultimo id della categoria letta per utilizzarlo nel successivo record all'interno della if dove viene deciso in che modo va avvalorata la variabile @running...di più ninzo!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
SELECT art.title, art.id, art.Created, art.catid, cat.title, art.Running FROM ( SELECT temp_Art.title, temp_Art.sectionid, temp_Art.catid, temp_Art.ID, temp_Art.Created, temp_Art.state, @running:=IF(@previous=temp_Art.catid,@running,0) + 1 AS Running, @previous:=temp_Art.catid FROM ( SELECT @running:=IF(@previous=catid,@running,0) + 1 AS Running, @previous:=catid, sectionid, catid, id, title, created, state FROM jos_content ORDER BY catid, created DESC )AS temp_Art )AS art LEFT JOIN jos_categories AS cat ON art.catid=cat.id WHERE art.sectionid=5 AND art.state=1 AND art.Running <=3 ORDER BY cat.id, running |
REFERENCES