具有多个实例的mysql Max

具有多个实例的mysql Max,mysql,count,max,having,Mysql,Count,Max,Having,我正在寻找一种方法,以适应查找最大值和最小值时出现的多个结果。我找到了与上一个问题的链接: 其中一个答案是: 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

我正在寻找一种方法,以适应查找最大值和最小值时出现的多个结果。我找到了与上一个问题的链接:

其中一个答案是:

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  
)
这是一种公认的做法,特别是对于大型数据库?如果这有意义的话,上面的查询不是基本上在自身内部运行吗

我有一个更复杂的查询,也需要找到ma和min。我想优化它:

编辑:

我正在尝试用不同的方法来寻找最大值和最小值,但到目前为止运气都不好。如果您能在这方面提供更多帮助,我们将不胜感激 谢谢
mc

在大型数据库上使用have是个坏主意。此外,您的问题可以通过以下方式解决:我有MySQL 5.5版本:

SELECT  
  color_id, 
  COUNT(color_id) AS totalCount
FROM    
  products 
WHERE   
  item_id = 1234 
GROUP BY 
  color_id 
ORDER BY 
  totalCount DESC 
LIMIT 1
have的问题是,它是在整个查询完成后执行的,即存储引擎已经工作,因此无法对have条件进行索引或其他优化,因此,它可以被视为完整的结果集扫描

多亏了@GordonLinoff,我发现这并不是你想要的。如果要查找所有对应的行,最好按照Gordon的建议进行操作

虽然我找到了另一种方法来解决这个问题,但它可能只比最初的版本好几点,因为存储引擎会同时涉及到这两个方面

SELECT
  first.color_id, 
  first.rows_count 
FROM 
  (SELECT color_id, COUNT(1) AS rows_count FROM products WHERE item_id=1234 GROUP BY color_id) AS first 
  LEFT JOIN
  (SELECT color_id, COUNT(1) AS rows_count FROM products WHERE item_id=1234 GROUP BY color_id ORDER BY rows_count DESC LIMIT 1) AS second 
    ON first.rows_count=second.rows_count 
WHERE second.rows_count IS NOT NULL;

我还有一个变量和Gordon的变量相似。因此,您可以在这些选项中进行选择。

您的问题的答案是,在MySQL中,使用一个查询有多种方法可以实现这一点

一种方法是你问题中的方法。另一种方法是使用变量:

select color_id, totalcount
from (SELECT color_id, COUNT(color_id) as totalCount,
             @maxcount = if(@maxcount < count(color_id), count(color_id), @maxcount)
      FROM products cross join
           (select @maxcount := 0) const
     WHERE item_id = 1234 
     GROUP BY color_id 
    ) t
where totalCount = @maxcount;
select color_id, totalcount
from (SELECT color_id, COUNT(color_id) as totalCount,
             @maxcount = if(@maxcount < count(color_id), count(color_id), @maxcount),
             @mincount = if(@mincount > count(color_id) or @mincount = -1, count(color_id), @mincount)
      FROM products cross join
           (select @maxcount := -1, @mincount := -1) const
     WHERE item_id = 1234 
     GROUP BY color_id 
    ) t
where totalCount in (@mincount, @maxcount);
但是,MySQL不支持这些

编辑:

如果要使用变量计算最大值和最小值:

select color_id, totalcount
from (SELECT color_id, COUNT(color_id) as totalCount,
             @maxcount = if(@maxcount < count(color_id), count(color_id), @maxcount)
      FROM products cross join
           (select @maxcount := 0) const
     WHERE item_id = 1234 
     GROUP BY color_id 
    ) t
where totalCount = @maxcount;
select color_id, totalcount
from (SELECT color_id, COUNT(color_id) as totalCount,
             @maxcount = if(@maxcount < count(color_id), count(color_id), @maxcount),
             @mincount = if(@mincount > count(color_id) or @mincount = -1, count(color_id), @mincount)
      FROM products cross join
           (select @maxcount := -1, @mincount := -1) const
     WHERE item_id = 1234 
     GROUP BY color_id 
    ) t
where totalCount in (@mincount, @maxcount);

这可能是一个更有效的查询,但它不能回答问题。该问题特别指出,多个颜色标识可能满足最大条件。这只返回一个值。Hm@GordonLinoff,这是正确的-因为上面的查询只返回一行。我会改正的。谢谢你的回复。虽然我的问题比那复杂一点。就目前而言,这就是我所拥有的,用于查找最大值和最小值:请参见上面的编辑,我无法将我的查询添加为注释。我想容纳一个以上的最大值和最小值,但不知道how@GordonLinoff你能为我附加的报价提供一个解决方案,找出最大值和最小值吗?谢谢你能建议我修改一下上面的问题吗?ThanksI运行此查询,并返回空列