2

我有一个带有targeted_refills列的MySQL表:(唯一id,主键)pat_name,,,,,,,,,,,,,,,,,,pat_phonerx_numberdrug_nameqty_displast_dateqty_leftprice_codelast_pricelast_contactdoc_nameehfuserid

我要做的是为每个userid. 我要列出的记录是基于该字段的最新last_date记录,但是如果该用户有多个具有最近日期的记录,那么我希望它选择该字段中具有最大值的字段last_price。在极少数情况下,有两条记录匹配last_datelast_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;

它在到达我想去的地方方面做得很合理,但它比我想要的要多一些记录。我现在正在比较,看看它提取了哪些额外的记录以及原因。它也需要很长时间才能运行。

4

1 回答 1

0

更新您可以稍微调整您现有的查询:您至少需要一个连接条件,以防止在多行中两者last_datelast_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演示。

于 2013-06-14T22:42:33.293 回答