我已经查看了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/