如何在 MySQL 中使用 HAVING 限制列表?

Posted

技术标签:

【中文标题】如何在 MySQL 中使用 HAVING 限制列表?【英文标题】:How to limit list by using HAVING in MySQL? 【发布时间】:2021-07-13 07:20:49 【问题描述】:

我试图通过在 mysql 5.7 中使用 HAVING 将每个商家 ID 的结果集限制为 5。不幸的是,这似乎不起作用,我不知道为什么。

我的 SQL 查询将三个表连接在一起,并确定制造商列出的类别。我想将此列表限制为每个商家 ID 5 个:

SELECT
    mcs.CAT_ID
FROM tbl1 mc
    INNER JOIN tbl2 mcs ON mc.ID = mcs.CAT_ID
    INNER JOIN tbl3 p ON mcs.ARTICLE_ID = p.SKU
WHERE
    p.MANUFACTURER_ID =18670
group by 
    mc.merchant_ID, mcs.CAT_ID
HAVING 
    COUNT(mc.merchant_id) < 5

我正在阅读关于在未查看 where 语句的情况下执行的 SO,但是限制此列表的正确方法是什么?

【问题讨论】:

不确定您所说的“不查看 where 语句”是什么意思,但是单独应用于每个结果行,因此 count 与您在选择列表中有 COUNT(mc.merchant_id) 时没有什么不同。 mysql 8 和 mariadb 有窗口函数,可以考虑不止一行用于这样的目的;对于 5.7,您将不得不做一种粗略的解决方法 【参考方案1】:

您没有提供表架构和虚拟数据,因此我无法确定确切的查询,但我会使用以下方法:

SELECT
    mc.merchant_id, t.CAT_ID
FROM tbl1 mc
  INNER JOIN (
    SELECT mcs.CAT_ID
    FROM tbl2 AS mcs
    WHERE mc.ID = mcs.CAT_ID
    AND EXISTS (
      SELECT 'x'
      FROM tbl3 AS p
      WHERE p.SKU = mcs.ARTICLE_ID
      AND p.MANUFACTURER_ID = 18670
    )
    LIMIT 5
  ) as t
;

通过连接中的子查询,我选择了与该 mc.ID 相关的所有 CAT_ID,这些 CAT_ID 具有所选产品的列表 (18670),限制为 5 行。这样,限制为 5 将应用于每个商家 ID

【讨论】:

以上是关于如何在 MySQL 中使用 HAVING 限制列表?的主要内容,如果未能解决你的问题,请参考以下文章

从带有 HAVING 子句的 MySQL 视图中选择返回空结果集

goup by ... having 用法

mysql中删除重复数据

MySQL的having子句

MySQL查询

mysql的一些基本常识