【问题标题】:Selecting distinct value from a column in MySql从 MySql 的列中选择不同的值
【发布时间】:2014-01-27 12:01:08
【问题描述】:

假设,我有一个名为 items 的表:

sender_id receiver_id goods_id price
  2            1          a1   1000
  3            1          b2   2000
  2            1          c1   5000
  4            1          d1   700
  2            1          b1   500   

这里我想从 items 表中按价格降序选择 sender_id,goods_id,这样就不会出现多次包含相同 sender_id 值的行(这里 sender_id 2)。我使用了以下查询,但徒劳无功:

select distinct sender_id,goods_id from items where receiver_id=1 order by price desc

结果显示所有五个元组(记录),其中包含 sender_id 2 的元组按时间降序排列三次。但我想要只显示三个记录,其中一个的 sender_id 为 2,最高价格仅为 5000 。 我该怎么办? 我的预期输出是:

sender_id goods_id
   2         c1
   3         b2
   4         d1

【问题讨论】:

  • 你能发布上表的预期输出吗?
  • 我已经编辑了我的问题@ling.s
  • 为什么你得到 price 作为receiver_id?
  • 对不起@ling.s 我更正了!
  • 您不想在预期输出中使用goods_id 而不是receiver_id 吗?

标签: mysql sql select group-by groupwise-maximum


【解决方案1】:

获取每个组的最高价格,您可以这样做:

SELECT T1.*
FROM (
    SELECT
     MAX(price) AS max_price,
     sender_id
    FROM items
    GROUP BY sender_id
) AS T2
INNER JOIN items T1 ON T1.sender_id = T2.sender_id AND T1.price = T2.max_price
WHERE T1.receiver_id=1 
ORDER BY T1.price

【讨论】:

    【解决方案2】:
    select distinct (sender_id,goods_id) from items where receiver_id=1 order by price desc;
    

    你可以这样使用。

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT i.sender_id, i.goods_id 
      FROM items i 
      INNER JOIN (SELECT i.sender_id, MAX(i.price) AS maxPrice
                  FROM items i WHERE i.receiver_id=1 
                  GROUP BY i.sender_id
                 ) AS A ON i.sender_id = A.sender_id AND i.price = A.maxPrice
      WHERE i.receiver_id=1
      

      SELECT i.sender_id, i.goods_id 
      FROM (SELECT i.sender_id, i.goods_id 
            FROM (SELECT i.sender_id, i.goods_id 
                  FROM items i WHERE i.receiver_id=1 
                  ORDER BY i.sender_id, i.price DESC
                 ) AS i 
            GROUP BY i.sender_id
           ) AS i
      

      【讨论】:

      • 第二部分给出了输出,但第一部分给出了错误,无论如何感谢我的投票!
      • @rosemary 不客气...检查更新的答案。现在两个查询都可以工作。我在MAX(price) AS maxPrice, 之后添加了comma,这是一个拼写错误。我已经纠正了。我更喜欢使用 First 方法
      • 谢谢!已更正,但第一部分没有给出预期的输出。无论如何,就速度而言,哪种方法更好? @Saharsh Shah
      • @rosemary 根据我的说法,JOIN 是比任何其他方法更好的方法。我更喜欢使用 JOIN 的第一种方法
      【解决方案4】:

      请试试这个

      select sender_id,goods_id from items t1
      where not exists (select 1 from items t2
                        where t2.sender_id = t1.sender_id
                          and t2.receiver_id = t1.receiver_id
                          and t2.price > t1.price)
       and receiver_id = 1
      order by price desc
      

      【讨论】:

      • 我不明白 1 in (select 1 from items...) 的用法。你能给我一些建议吗? @tin tran
      • 你可以在那里选择任何东西。因为存在检查该选择是否返回任何行。 Not Exists 确保该子查询中没有 ID 与 t1 相同且价格更高的行。您可以选择 1 或选择 2 或选择 0 或选择 sender_id 任何您喜欢的内容。所以查询基本上是说哪里不存在一行(具有相同的 id 和更高的价格)。
      • 好吧...@tin tran 我们也可以使用 * 代替 1 或 0 或 2..?但那只是开销,对吧?
      猜你喜欢
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      相关资源
      最近更新 更多