【问题标题】:MySQL select DISTINCT by highest valueMySQL按最大值选择DISTINCT
【发布时间】:2012-07-11 13:48:44
【问题描述】:

我有一桌杂志,需要提取每本杂志的最新一期。

我试过了

    SELECT DISTINCT
    magazine
        FROM
    product p
        INNER JOIN
    (SELECT 
        title, MAX(onSale) AS Latest
    FROM
        product
    GROUP BY magazine) groupedp

返回不同的杂志,但不返回我需要的其余数据。

更新:

架构

-id----onsale----magazine
  1    1/12/12   Fishing Mag
  2    1/11/12   Fishing Mag
  3    12/03/11  Pencil Sharpening Monthly
  4    1/02/10   Pencil Sharpening Monthly
  5    16/04/09  Homes in the Sky

所以我希望返回的结果是:

 -id----onsale----magazine
   1    1/12/12   Fishing Mag         
   3    12/03/11  Pencil Sharpening Monthly         
   5    16/04/09  Homes in the Sky

【问题讨论】:

  • 您要在哪些列上加入表格?
  • 如果我们可以看到这两个表的架构,这可能会更容易回答。
  • 只有一张桌子。
  • 是的...对不起...复制/粘贴变坏了,仍然架构会很好,知道如何对其自身执行连接表,以及您正在处理的数据类型。
  • Schema 已添加,这感觉是一个非常简单的问题,但我无法正确理解 DISTINCT / JOIN 部分。

标签: mysql


【解决方案1】:
SELECT 
    p.*
FROM
        product p
    INNER JOIN
        ( SELECT 
              magazine, MAX(onSale) AS latest
          FROM
              product
          GROUP BY 
              magazine
        ) AS groupedp
      ON  groupedp.magazine = p.magazine
      AND groupedp.latest = p.onSale ;

【讨论】:

  • 谢谢。这只会返回最新的,而不是每个问题的最新。
  • 我在您的表格中没有看到 issue 列。
  • 我的意思不仅仅是表包含问题。
  • 在哪里?这些数据在哪一列?
  • 该表是一个充满“问题”的表。所以,第 1 期、第 2 期等虽然没有这样定义,但它由 'onsale' 定义。
【解决方案2】:
SELECT id, MAX(onSale) as latest, magazine
FROM product
GROUP BY magazine
ORDER BY latest DESC

【讨论】:

  • 这可能会显示 idonSale 在表格中实际上不匹配。
  • @ypercube 是正确的。你有什么需要身份证吗?由于它没有被聚合或包含在 GROUP BY 子句中,因此可能会给您带来不一致的结果
  • @ypercube Jeff 你们都是对的。结果不正确,因为 id 和 onSale 不相关。
  • 我投了反对票,因为您需要添加评论指出 id 和 onSale 在结果中可能不匹配,我将删除我的反对票。
【解决方案3】:

没有一个给出的答案是正确的,因为它们返回了一组不相关的数据,这些数据不代表一个确切的行。 id 可能不是与 onsale 值位于同一行的 id

以下将起作用:

SELECT
    id, onsale, magazine
FROM (
    SELECT
       id, onsale, magazine
    FROM
        product
    ORDER BY
        onsale DESC) AS a
GROUP BY
    magazine

【讨论】:

    【解决方案4】:

    这看起来像你需要的:

    SELECT id, MAX(onsale) AS onsale, magazine FROM magazines GROUP BY magazine ORDER BY onsale DESC;
    

    查看:

    http://sqlfiddle.com/#!2/38e78/3

    更新: 我稍微改变了查询,返回 MAX(onsale)

    【讨论】:

    • 被杰夫打败了,简直是秒杀!
    【解决方案5】:

    您需要将“其余数据”放在第一个选择中:

    SELECT DISTINCT magazine, "rest of data"
    FROM product p 
    INNER JOIN 
    ( SELECT title, MAX(onSale) AS Latest 
    FROM product 
    GROUP BY magazine ) groupedp
    

    【讨论】:

      猜你喜欢
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2022-01-03
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多