MYSQL GROUP BY 和 WHERE 子句

标签 mysql greatest-n-per-group

我已经查看了Greatest-n-group-by组,但找不到这个答案,并且无法使JOIN解决方案与WHERE子句一起使用。这是我得到的。

t1 表:

ID  Product_Name    Quantity    pharmacyShort   Copay_Amount
581284  AMLODIPINE 10 MG    30  WALGREENS   21.07
581283  AMLODIPINE 10 MG    30  CVS 36.61
581282  AMLODIPINE 10 MG    28  RITE AID    30.98
581280  AMLODIPINE 10 MG    60  WALGREENS   50.65
581279  AMLODIPINE 10 MG    30  CVS 29.78
581278  AMLODIPINE 10 MG    30  RITE AID    14.28
581277  AMLODIPINE 10 MG    180 WALGREENS   33.83
581276  AMLODIPINE 10 MG    15  CVS 18.33
581275  AMLODIPINE 10 MG    10  RITE AID    45.93
581274  AMLODIPINE 10 MG    30  PUBLIX  33.75

我还有一个优先级表,称之为 t2,我希望输出按以下优先级(排序):

id  pharmacyShort   COUNT
1   CVS 100
2   RITE AID    99
3   TARGET  98
4   WALGREENS   97
5   WALMART 96
6   KMART   95
7   KROGER  94
8   PUBLIX  93

MYSQL:

SELECT t1.pharmacyShort , t1.Copay_Amount 
FROM `t1` 
INNER JOIN `t2` 
ON t1.pharmacyShort = t2.pharmacyShort 
WHERE t1.Product_Name = 'AMLODIPINE 10 MG' 
AND t1.Quantity = '30' 
AND t1.ID > 555000 
GROUP BY t1.pharmacyShort 
ORDER BY t2.COUNT DESC LIMIT 30

我的 ID > 555000 以保持较低的查询时间。另外,我试图显示最新的价格。也许这可以通过 ORDER BY 来完成,但挑战在于有些药物的 claim 较多,而另一些药物的 claim 则少得多,这意味着我必须回溯到更早的时间才能获得价格。

我希望得到的是这个(实际上我只需要输出上的 pharmacyShort 和 Copay_Amount 列,但为了清楚起见,在这里保留了其他列):

581283  AMLODIPINE 10 MG    30  CVS 36.61
581284  AMLODIPINE 10 MG    30  WALGREENS   21.07
581278  AMLODIPINE 10 MG    30  RITE AID    14.28
581274  AMLODIPINE 10 MG    30  PUBLIX  33.75

输出应仅选择 ID 为 581283 的 CVS,并仅显示来自 CVS 的一个声明,但(据我所知)GROUP BY 选择较旧的声明 581279,如下所示:

581279  AMLODIPINE 10 MG    30  CVS 29.78
581284  AMLODIPINE 10 MG    30  WALGREENS   21.07
581278  AMLODIPINE 10 MG    30  RITE AID    14.28
581274  AMLODIPINE 10 MG    30  PUBLIX  33.75

如果它能让事情变得更容易,我可以没有优先级表。我也考虑过尝试在 PHP 端通过某种数组排序来解决这个问题,但我认为 MYSQL 会更快。

非常感谢所有能提供帮助的人,并给予他们良好的业力。

更新:

根据我得到的答案,这就是我所在的位置:

SELECT a.pharmacyShort, a.copay_amount
FROM `t1` a
JOIN (SELECT MAX(ID) as maxid, pharmacyShort
FROM `t1`
WHERE Product_Name = 'AMLODIPINE 10 MG' 
      AND Quantity = '30' 
      GROUP BY pharmacyShort) AS maxt1
  ON a.pharmacyShort = maxt1.pharmacyShort AND a.id = maxt1.maxid
join t2 b ON a.pharmacyShort = b.pharmacyShort
ORDER BY b.count DESC
LIMIT 20

我从 WHERE 子句中删除了 id > 550000,因为使用 MAX(ID) 我认为我不需要它。

但是我得到的结果集为零。那么我哪里出错了?

最佳答案

SQL select only rows with max value on a column 处使用加入简单组标识符、组内最大值子查询方法,并将条件放入子查询中。

然后将其与 t2 连接以获取用于排序的 count 列。

SELECT t1.pharmacyShort, t1.copay_amount
FROM t1
JOIN (SELECT pharmacyShort, MAX(id) AS maxid
      FROM t1
      WHERE Product_Name = 'AMLODIPINE 10 MG' 
      AND Quantity = '30' 
      AND ID > 555000
      GROUP BY pharmacyShort) AS maxt1
    ON t1.pharmacyShort = maxt1.pharmacyShort AND t1.id = maxt1.maxid
JOIN t2 on t1.pharmacyShort = t2.pharmacyShort
ORDER BY t2.count DESC
LIMIT 20

关于MYSQL GROUP BY 和 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48307144/

相关文章:

mysql - 如何加速mysql下面的程序?

mysql - Sql 案例与案例 Order by

mysql - 在大型 SQL 表中查找工资的第三个最大值

mysql - 获取MYSQL中多个用户的时间戳之前的最后结果

mysql - 从 MySQL 表中选择 10 条具有唯一作者的最新评论

php - MySQL 内部连接返回同一行的倍数

MySQL 更新查询语法错误

php - sql查询显示两个表的余额

sql - 我如何在每个组中只选择最小创建日期的 ID

mysql - 我已经走进了死胡同。 SQL查询获取最后回复的用户名和时间戳