如何在 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 限制列表?的主要内容,如果未能解决你的问题,请参考以下文章