Select 只有 table 的唯一 ID 行具有不同的值(按降序排列)

Select only unique ids row of table with different values in Descending order

我正在尝试获取具有相同 medicine_id 和唯一 insurance_id 以及最后插入的行的数据。将 Group by 和 Order by 放在一起,但其中的随机数据不是最后插入的。 我试过这段代码,但没有得到最后插入的数据

SELECT
    `m1`.`*`
FROM
    (
        `pricings` `m1`
    LEFT JOIN `pricings` `m2` ON
        (
            (
                (
                    `m1`.`medicine_id` = `m2`.`medicine_id`
                )
            )
        )
    )
     WHERE m1.medicine_id = 2
    group BY m1.insurance_id DESC
    ORDER BY m1.created_at;

这里是总行数。 这是完整的table

id medicine_id insurance_id created_at
4311 2 1 2021-04-12 16:05:07
4766 2 1 2022-01-15 11:56:06
4767 2 38 2021-05-12 08:17:11
7177 2 38 2022-03-30 10:14:11
4313 2 39 2021-04-12 16:05:46
4768 2 39 2021-05-12 08:17:30
1356 2 40 2020-11-02 11:25:43
3764 2 40 2021-03-08 15:42:16
4769 2 40 2021-05-12 08:17:44

我也想点赞

id medicine_id insurance_id created_at
4766 2 1 2022-01-15 11:56:06
4768 2 39 2021-05-12 08:17:30
4769 2 40 2021-05-12 08:17:44
7177 2 38 2022-03-30 10:14:11

也将其添加为答案。我还没有测试它,只是修复格式以适用于您正在使用的任何版本的数据库,并让我知道结果。

SELECT m1.id  , m1.Insurance_id , m1.medicine_id , max(m1,created_at)
FROM (
    `pricings` `m1` LEFT JOIN `pricings` `m2` ON `m1`.`medicine_id` = `m2`.`medicine_id`
    )
WHERE m1.medicine_id = 2 and m1.insurance_id in (1,39,40,38)
GROUP BY m1.insurance_id DESC
ORDER BY m1.created_at;

编辑。我也去掉了6个额外的括号,我看不出它们有什么用

MySQL 5.x:使用 sub-query 找到每个组的最大 created_at 值,然后将其加入源 table 以识别它来自的行。

SELECT
  p.`*`
FROM
  `pricings`   p
INNER JOIN
(
  SELECT
    `medicine_id`,
    `insurance_id`,
    MAX(created_at)   AS `created_at`
  FROM
    `pricings`
  GROUP BY
    `medicine_id`,
    `insurance_id`
)
  p_max
    ON  p.`medicine_id`  = p_max.`medicine_id`
    AND p.`insurance_id` = p_max.`insurance_id`
    AND p.`created_at`   = p_max.`created_at`
WHERE
  p.`medicine_id` = 2
ORDER BY
  p.`created_at`;

MySQL8:用ROW_NUMBER()枚举每组,然后从每组中选取第一行。

SELECT
  p.`*`
FROM
  `pricings`   p
FROM
(
  SELECT
    *,
    ROW_NUMBER() OVER (
      PARTITION BY `medicine_id`,
                   `insurance_id`
          ORDER BY `created_at` DESC
    )
      AS `row_id`
  FROM
    `pricings`
)
  p
WHERE
      p.`medicine_id` = 2
  AND p.`row_id`      = 1
ORDER BY
  p.`created_at`;