MYSQL GROUP BY with WHERE子句

MYSQL GROUP BY with WHERE子句,mysql,greatest-n-per-group,Mysql,Greatest N Per Group,我已经逐一查看了最伟大的n个组,但找不到这个答案,也无法使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 RIT

我已经逐一查看了最伟大的n个组,但找不到这个答案,也无法使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以保持较低的查询时间。另外,我想展示一下最近的价格。也许这可以通过订购来实现,但挑战在于,一些药物的需求量更大,而另一些药物的需求量要小得多,这意味着我必须追溯到更久远的时间才能获得价格

我希望得到的是,我实际上只需要输出上的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的CV,并仅显示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,因为使用MAXID我认为我不需要它

但我得到的结果集为零。那么我错在哪里呢?

使用连接简单组标识符、组子查询中的最大值方法,并将条件放入子查询中

然后将其与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

你如何确定最近的价格?没有日期列。使用我链接到的问题中的一种技术,编写一个子查询以获取最近的价格。然后将其与优先级表连接起来。这是一个不同的问题,因为我不只是寻找该连接产生的NULL。我需要精简到药品、数量和药房。在你提到的问题中,这是怎么回事?最后?内部连接?似乎所有这些例子都是本组中最重要的问题/答案。所有人都在寻找最高或最新的X。我在寻找最新的X,其中A、B、C和DSadly,我的日期是varchar,所以不是很有用。但是,ID是连续的,它给了我某种程度的指示,说明它们是什么时候被输入的,我可以使用它。你在说什么空值?好的,Barmar,我正在努力解决这个问题。你概述的第一步……有效!我知道,我听起来很震惊,也许不应该,但我已经为此工作了好几个小时,所以这是一个进步。下一步,第2步…谢谢!!从t1中选择a.ID,a.pharmacyShort内部连接从t1组中选择pharmacyShort,最大ID由pharmacyShort b在a.pharmacyShort=b.pharmacyShort和a.ID=b.ID限制150,30检查!我在最上面的帖子中的更新确实有效!它起作用了!它起作用了!它起作用了!天哪,我背上真是一只猴子。谢谢你,巴尔马!从沮丧到高兴…非常感谢!您应该编辑该问题以删除表示该问题无效的更新。您的查询似乎与答案相同,因此无需在问题中重复。