1. 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″

    \\ emneord: , ,