webForumDet fria alternativet

Vill gruppera och räkna antalet?

Databaser & SQL

4 svar · 653 visningar · startad av UrMe

Medlem sedan apr. 2001762 inlägg
Frågan#1

Jag har en SQL fråga så här:

SELECT document_id FROM `statistics` WHERE download_time BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 day) AND CURDATE() GROUP BY document_id, user_ip

Jag grupperar så dokument_id + user_ip blir unikt.

Nu visar denna SQL fråga t.ex
16
16
16
19
19
21
25
25
25

Men jag skulle vilja ha ut denna SQL fråga så här:
ID | Antal
16 | 3
19 | 2
21 | 1
25 | 3

Har försökt med olika varianter av subqueries osv men får aldrig ut korrekt antal. Någon som har en idé?

Medlem sedan juni 20019 519 inlägg
#2

Nu var det ett tag sen jag skrev SQL men:

SELECT document_id as ID, Count(document_id) as Antal FROM `statistics` WHERE download_time BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 day) AND CURDATE() GROUP BY document_id, user_ip

är väl så man få den struktur du vill ha? Eller något i den stilen?

Medlem sedan apr. 2001762 inlägg
#3

Det har jag provat men den räknar ju varje id+user_ip som 1, eftersom den är grupperad där efter.

Så här blir resultatet t.ex:

Array
(
    [0] => Array
        (
            [document_id] => 16
            [0] => 16
            [antal] => 1
            [1] => 1
        )

    [1] => Array
        (
            [document_id] => 16
            [0] => 16
            [antal] => 1
            [1] => 1
        )

    [2] => Array
        (
            [document_id] => 16
            [0] => 16
            [antal] => 1
            [1] => 1
        )

    [3] => Array
        (
            [document_id] => 16
            [0] => 16
            [antal] => 1
            [1] => 1
        )

    [4] => Array
        (
            [document_id] => 16
            [0] => 16
            [antal] => 1
            [1] => 1
        )

    [5] => Array
        (
            [document_id] => 16
            [0] => 16
            [antal] => 1
            [1] => 1
        )

    [6] => Array
        (
            [document_id] => 16
            [0] => 16
            [antal] => 1
            [1] => 1
        )

    [7] => Array
        (
            [document_id] => 16
            [0] => 16
            [antal] => 1
            [1] => 1
        )

    [8] => Array
        (
            [document_id] => 17
            [0] => 17
            [antal] => 1
            [1] => 1
        )

...
...
...
Medlem sedan juni 200032 967 inlägg
#4

Kanske kan detta lira?

SELECT document_id as ID, count(distinct user_ip) as antal
FROM `statistics` 
WHERE download_time BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 day) AND CURDATE() 
GROUP BY document_id

mvh

Medlem sedan apr. 2001762 inlägg
#5

Kanon! Det där verkar fungera! :)

271 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
131 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)