【问题标题】:MySQL: select all rows where just the name is distinct [duplicate]MySQL:选择只有名称不同的所有行[重复]
【发布时间】:2018-10-23 21:02:31
【问题描述】:

我目前正在尝试仅在名称列中选择唯一条目。我曾尝试使用此查询,但它也不会返回相同的价格。我尝试了其他变体也没有成功。

SELECT DISTINCT name, price from table;

这是我正在使用的表格:

+----+-------------------+
| id | name      | price |
+----+-----------+-------+
| 1  | Henry     | 20    |
| 2  | Henry     | 30    |
| 3  | Robert    | 20    |
| 4  | Joshua    | 10    |
| 5  | Alexander | 30    |
+----+-----------+-------+

我正在寻找的输出是:

+----+-------------------+
| id | name      | price |
+----+-----------+-------+
| 1  | Henry     | 20    |
| 3  | Robert    | 20    |
| 4  | Joshua    | 10    |
| 5  | Alexander | 30    |
+----+-----------+-------+

如您所知,所需的输出只删除了重复的名称,没有删除任何价格。我可以在上面的查询中添加一些内容以仅选择名称列中的唯一条目吗?非常感谢任何帮助,因为我试图在这里、Google、DuckDuckGo 等上找到解决方案,但没有运气。

【问题讨论】:

  • 你关心返回哪一行?哪个 ID/价格对?

标签: mysql select distinct


【解决方案1】:

根据您的示例数据,这应该可行。

SELECT MIN(Id) AS Id, name, MIN(price) AS price 
FROM table
GROUP BY name;

【讨论】:

  • 如果具有最低数字的行没有最低价格,则此结果将极具误导性(即错误)。我不推荐它。
【解决方案2】:

这就是GROUP BY 的用途:

SELECT * FROM `table` GROUP BY `name`

通常是run into trouble 的人,因为当一个给定名称有多个匹配项时,他们现在将获得一个任意选择的行——您必须使用聚合函数来选择一个特定的行,例如“价格最高的那个”。

但在您的情况下,由于您似乎并不关心返回哪一行,因此这是完美的。

【讨论】:

    【解决方案3】:

    所以你想选择不同的行列表,然后从表中选择给定的整行?试试这个查询,其中临时查询只是一个 uniqueid 列表,然后该行链接回表。

    Select n.*
    From nameprices n
    Join (Select MIN(id) as id
      From nameprices
      Group by name
      Order By id) aTemp On (aTemp.id=n.id);
    

    这是 SQL 查询中的常见问题,我们希望使用给定的完整行数据,但过滤器使用的是 distinct/groupby 公式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-19
      • 2014-04-12
      • 2015-05-28
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多