2013-01-10 9 views
9

Mieć tabelę produktów z item_id i color_id. Próbuję uzyskać color_id z najbardziej nie-pustymi instancjami.SELECT id HAVING maksymalna liczba id

ta zawodzi:

SELECT color_id 
    FROM products 
WHERE item_id=1234 
GROUP BY item_id 
HAVING MAX(COUNT(color_id)) 

z

Invalid use of group function 

This

SELECT color_id, COUNT(color_id) 
    FROM products 
WHERE item_id=1234 
GROUP BY item_id 

Zwraca

color_id count 
1, 323 
2, 122 
3, 554 

Szukam color_id 3, który ma większość wystąpień.

Czy istnieje szybki i łatwy sposób na uzyskanie tego, czego chcę, bez 2 zapytań?

Odpowiedz

13
SELECT color_id AS id, COUNT(color_id) AS count 
FROM products 
WHERE item_id = 1234 AND color_id IS NOT NULL 
GROUP BY color_id 
ORDER BY count DESC 
LIMIT 1; 

To daje color_id i na to liczyć color_id zamówionej przez hrabiego od największego do najmniej. Myślę, że tego właśnie chcesz.


za edycję ...

SELECT color_id, COUNT(*) FROM products WHERE color_id = 3; 
+0

sprawdź mój edit - I typoed kolumnę gdzie. –

+0

Powinieneś dodać "limit 1", aby odpowiedzieć na pytanie. –

+0

Właśnie sprawdziłem, czy to działa - dziękuję. –

4
SELECT color_id 
FROM 
    (
     SELECT color_id, COUNT(color_id) totalCount 
     FROM products 
     WHERE item_id = 1234 
     GROUP BY color_id 
    ) s 
HAVING totalCount = MAX(totalCount) 

UPDATE 1

SELECT color_id, COUNT(color_id) totalCount 
FROM products 
WHERE item_id = 1234 
GROUP BY color_id 
HAVING COUNT(color_id) = 
(
    SELECT COUNT(color_id) totalCount 
    FROM products 
    WHERE item_id = 1234 
    GROUP BY color_id 
    ORDER BY totalCount DESC 
    LIMIT 1 
) 
+0

Doceniam odpowiedź. Dziękuję Ci. –

1
SELECT 
    color_id, 
    COUNT(color_id) AS occurances 
FROM so_test 
GROUP BY color_id 
ORDER BY occurances DESC 
LIMIT 0, 1 

Oto próbka skrzypce z podstawowej tabeli, która pokazuje, że działa: sql fiddle