Dec 04

For litt siden kom noen til meg over MSN og lurte på hvordan de kunne bruke GROUP_CONCAT() men bare implodere de 3 nyeste (høyest ID). Og dette ville han da gjøre uten noen loop som helst. Jeg sier til han at han burde bruke PHPs implode()-funksjon, men det ville han visst ikke. MySQL skal vel egentlig ikke brukes til å manipulere date, men heller til å håndtere/deligere/lagre innhold (data).

Uansett tenkte jeg at løsningen måtte være å bruke en subquery, hvor man sjekket at id var i id-ene som ble plukket ut av subqueriet. Nyere versjoner støtter ikke å bruke IN/ALL/ANY/SOME til subqueries i WHERE-clause, så da er løsningen ganske selvsigende.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
   GROUP_CONCAT(
      a.id
      ORDER BY a.id DESC
      SEPARATOR ', '
   ) as imploded_idfield
FROM myField a
INNER JOIN
   (
      SELECT id
      FROM myField
      ORDER BY id DESC
      -- [WHERE ... ]
      LIMIT 3
   ) b
ON a.id = b.id

Da har vi alle de imploderte verdiene i imploded_idfield, og kan se ut noe som

“300, 299, 298″

\\ tags: , ,

Legg igjen en kommentar