MYSQL限制特定列值的出现次数

3
从数据库中获取一些优惠券。每个优惠券都有一个包含其所属商家id的merchantid列。
我正在尝试构建一个查询来获取5个优惠券,但是我只想要每个merchantid对应的1个优惠券。我不想要具有相同merchantid的多个优惠券。

2
你是想要随机选择还是只是一些不同的行? - fitne
在查询中,我想首先按照点击次数进行排序,然后按每个零售商的点击次数最高的优惠券进行选择。我该如何实现? - PaperChase
2个回答

3
您可以使用

SELECT * FROM coupons GROUP BY merchantid LIMIT 0,5;

如果你不想让MySQL决定保留哪个merchantid,你可以使用子查询添加条件(在下面的示例中-保留点击次数最高的商家):

MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列(请参阅文档)。

而且它将会奏效,因为:

已修复:

SELECT c1.* 
FROM coupons c1 JOIN (
    SELECT t.merchantid, MAX(t.numberofclicks) maxnumberofclicks
    FROM coupons t GROUP BY t.merchantid
) c2 ON c1.merchantid = c2.merchantid AND c1.numberofclicks = c2.maxnumberofclicks 
LIMIT 0,5;

还有一种更简洁,对大型数据集可能更快的方法来解决这个问题:

SELECT c1.*
FROM coupons c1 JOIN coupons c2 ON c1.merchantid = c2.merchantid
GROUP BY c1.merchantid, c1.numberofclicks
HAVING c1.numberofclicks = MAX(c2.numberofclicks)
LIMIT 0,5;

如果您想要最高点击次数的5个优惠券,请在LIMIT 0,5之前加上ORDER BY c1.numberofclicks DESC

我使用这个查询遇到了问题。 我有一些需要放在其中的WHERE条件。 到目前为止,它只提取每个商家一个优惠券,但是它提取的优惠券不是点击量最高的:SELECT C.couponid,C.fmtc_couponid,C.merchantid,C.label,C.restrictions,C.coupon,C.link,C.image,C.expire,C.unknown,C.clicks,M.name,M.approved,M.homepageurl,M.logo_image,M.permalink FROM tblCoupons C,tblMerchants M WHERE C.merchantid=M.merchantid AND C.begin < ".mktime()." AND C.expire > ".mktime()." AND M.display='1' GROUP BY C.merchantid ORDER BY C.clicks DESC LIMIT 0,6 - PaperChase
“GROUP BY” 在 “ORDER BY” 之前执行,因此您正在对已经“随机”过滤的记录进行排序。使用我的第二个或第三个示例,只需添加 JOIN tblMerchants ON tblMerchants.merchantid = tblCouopns.merchantidORDER BY clicksLIMIT 之前。 - lxa

0

尝试

SELECT * FROM your_table_name GROUP BY merchantid LIMIT 0,5; 

这将返回5行,其中包含不同的merchantid,但您可能会在不同的执行中获得相同的结果。如果您想要随机化它,请在'LIMIT A,5'内部随机化'A'


但我不确定如何使用group by!因此,您可能始终会在具有相同merchantid的行中获得相同的行! - fitne
这根本不应该起作用,因为 * 不是 GROUP BY 子句的一部分,也不是聚合函数的一部分。 - Jacob
这个成功了。谢谢。不过,在查询中我尝试首先按numberofclicks排序,然后取每个零售商点击次数最多的优惠券。我该如何做到这一点? - PaperChase
请使用@lxa提供的解决方案。 :) - fitne

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