我有一个MySQL表targeted_refills
,其中包含以下列:id
(唯一,主键),pat_name
,pat_phone
,rx_number
,{{1} },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
它可以合理地找到我想去的地方,但它会比我想要的还要多一些记录。我现在正在比较,看看有什么额外的记录和原因。它也需要很长时间才能运行。
答案 0 :(得分:0)
更新您可以稍微调整现有查询:当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 演示。