我有一个 MySQL 表 targeted_refills
,其中包含以下列:id
(唯一的主键)、pat_name
、pat_phone
, rx_number
, drug_name
, qty_disp
, last_date
, qty_left
, price_code
,last_price
,last_contact
,doc_name
,ehf
,userid
我想做的是为每个 userid
列出一条记录。我要列出的记录是基于字段 last_date
的最新记录,但是如果该用户有多个具有最新日期的记录,那么我希望它选择具有最大值的字段在字段 last_price
中。在极少数情况下,有两条匹配 last_date
和 last_price
的记录(不应该发生但有可能发生),我真的不在乎选择哪个,所以它可以从 id
的最大值中选择,因为它是唯一的并且是主键。
编辑:
我试过从另一个人的问题中拼凑出来的这个查询:
SELECT t1.*
FROM `targeted_refills` AS t1
LEFT OUTER JOIN `targeted_refills` AS t2
ON t1.userid = t2.userid
AND (t1.last_date < t2.last_date
OR (t1.last_date = t2.last_date AND t1.last_price < t2.last_price))
WHERE t2.userid IS NULL;
它在到达我想去的地方方面做得很合理,但它拉出的记录比我想要的多。我现在正在比较以查看它拉动了哪些额外记录以及原因。它也需要很长时间才能运行。
最佳答案
已更新 您可以稍微调整现有的查询:您至少需要一个连接条件来防止 last_date
和 last_price
在几行中是相等的。由于您有自动生成的 id
,您可以使用它来区分行。
SELECT t1.*
FROM targeted_refills t1 LEFT JOIN targeted_refills t2
ON t1.userid = t2.userid
AND (
t1.last_date < t2.last_date
OR
(t1.last_date = t2.last_date AND
t1.last_price < t2.last_price)
OR
(t1.last_date = t2.last_date AND
t1.last_price = t2.last_price AND
t1.id < t2.id)
)
WHERE t2.userid IS NULL;
或者您可以通过其他方式实现您的目标
SELECT id, pat_name, pat_phone, rx_number, drug_name,
qty_disp, last_date, qty_left, price_code,
last_price, last_contact, doc_name, ehf, userid
FROM
(
SELECT r.*,
@n := IF(@u = userid, @n + 1, 1) rownum,
@u := userid
FROM targeted_refills r
ORDER BY userid, last_date DESC, last_price DESC
) q
WHERE q.rownum = 1
这是 SQLFiddle 两个查询的演示。
关于MySQL每组获取一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17115899/