选择id,具有最大id数量的id。

15

有一个产品表,其中包含item_id和color_id。我想要获取非 null 实例最多的 color_id。

这种尝试失败了:

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

带着

Invalid use of group function
SELECT color_id, COUNT(color_id)
  FROM products 
 WHERE item_id=1234 
 GROUP BY item_id

返回

color_id count
1, 323
2, 122
3, 554

我正在寻找颜色ID为3的项目,它具有最多的实例。

是否有一种快速简便的方法可以在不进行两个查询的情况下获得我想要的东西?

4个回答

20
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;

这将为您提供按计数从高到低排序的color_id及其计数。我认为这就是您想要的。


用于您的编辑...

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

你应该在回答问题时添加 limit 1 - Gordon Linoff
2
@GordonLinoff limit 1. 如果有多个实例具有相同的最大计数,该怎么办? - John Woo
4
请考虑以下结果:1, 1002, 1003, 50 - John Woo
@JW 取决于上下文。也许您不在意最大值是否存在并列... 也许您在意... - matt walters
我认为这可能是我的逻辑问题...该显示什么。 - a coder
我需要为每个color_id分配一个重要性,并让它成为决定胜负的关键因素。 - a coder

9
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)

更新 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  
)

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

这里有一个使用基本表格的示例fiddle,展示了它的工作原理:sql fiddle

太棒了,这正是我在寻找的。 - VishalParkash

0
为了简单起见,使用Oracle内置函数(仅适用于Oracle数据库11g+版本):
select stats_mode(color_id) from so_test 

这将返回颜色ID的最高出现次数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接