Stampa
Categoria: SQL
Visite: 10784
Stella inattivaStella inattivaStella inattivaStella inattivaStella inattiva
 

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.

titleidCreatedcatidtitle 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

 

 

 

 

- have fun -