【问题标题】:MySQL query to group by and use distinct rowMySQL查询分组并使用不同的行
【发布时间】:2013-06-14 21:41:47
【问题描述】:

我有一个格式如下的表格:

 mysql> select pattern,trunks,cost from sms_prices where pattern=1;
 +---------+--------------+-------+
 | pattern | trunks       | cost  |
 +---------+--------------+-------+
 | 1       | Vitelity     | 0.099 |
 | 1       | Plivo        | 0.012 |
 | 1       | Twilio       | 0.012 |
 +---------+--------------+-------+
 3 rows in set (0.00 sec)

我的问题是:

考虑到此表还有另外 700 多个条目,其中 3-4 个条目用于相同的模式,我如何选择 DISTINCT(pattern) 按成本排序,ASC?

我试过了:

 mysql> select DISTINCT pattern,cost,trunks from sms_prices where pattern=1 order by cost;
 +---------+-------+--------------+
 | pattern | cost  | trunks       |
 +---------+-------+--------------+
 | 1       | 0.012 | Plivo        |
 | 1       | 0.012 | Twilio       |
 | 1       | 0.099 | Vitelity     |
 +---------+-------+--------------+
 3 rows in set (0.00 sec)

 mysql>

但正如你所看到的,它仍然给了我相同的 3 个结果。

如果我只选择一个 DISTINCT 行,它会给我一个条目:

 mysql> select DISTINCT pattern from sms_prices where pattern=1 order by cost;
 +---------+
 | pattern |
 +---------+
 | 1       |
 +---------+
 1 row in set (0.00 sec)

但我不知道这是哪个条目,所以结果没用。

请帮助查询每个 pattern 返回单个结果,最小 cost

谢谢!

【问题讨论】:

  • 您正在寻找的“理想”结果是什么?
  • 不同模式的列表(无重复) - 以及成本最低的树干。例如,我有模式 1 的 3 个条目,我想为此查看树干“Plivo”。当它扩展时(如果我删除 where pattern=1),对于模式“44”,我会有类似的情况,其中有 5 个不同的条目,所有条目的成本都不同。因此,我希望获得具有干线信息的不同前缀列表,成本最低。
  • 所以只返回每个模式的最低主干值。对吗?
  • 实际最低“成本”值
  • 结果将是模式、成本、中继

标签: mysql sql distinct


【解决方案1】:

也许这可能不是您想要的,但是:

SELECT pattern, cost, trunks 
FROM sms_prices 
WHERE cost = (select min(cost) from sms_prices where pattern = 1)
GROUP BY pattern;

问候

【讨论】:

  • 如何对表中的所有条目执行此操作(没有任何 where pattern=.. 约束)?
  • 知道了:SELECT pattern, cost, trunks FROM sms_prices AS OT WHERE cost = (select min(cost) from sms_prices as IT where OT.pattern=IT.pattern ) GROUP BY pattern;
【解决方案2】:

这不行吗?

select pattern, min(cost) mincost
from sms_prices 
where whatever
group by pattern

【讨论】:

  • select pattern, min(cost) mincost,trunks from sms_prices where pattern=1 group by pattern; -- 这将返回模式 = 1、mincost=0.012 和 trunks='Viteity' 当实际上主干应该是 'Plivo' 或 'Twilio' (它们有 0.012 ,小于 0.099 -- Vitity 的成本)
  • 这是查询:SELECT pattern, MIN(cost),cost AS mincost, trunks FROM sms_prices where pattern=1 GROUP BY pattern ORDER BY MIN(cost);结果如下: 1 | 0.012 | 0.099 | Vitity ... 它采用最小的成本(即 Plivo)并将其与 Vitity 一起使用——查看成本与 mincost 列
【解决方案3】:

SELECT pattern, cost, trunks FROM sms_prices AS OT WHERE cost = (select min(cost) from sms_prices as IT where OT.pattern=IT.pattern ) GROUP BY pattern;

【讨论】:

  • 我认为这最终会为每个模式值执行一次内部查询,这可能不是最有效的解决方案。
猜你喜欢
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 2012-02-18
相关资源
最近更新 更多