【问题标题】:I DISTINCTly hate MySQL (help building a query)我非常讨厌 MySQL(帮助构建查询)
【发布时间】:2011-02-10 09:43:05
【问题描述】:

我相信这是直截了当的:

我有一个包含 30,000 行的表。当我SELECT DISTINCT 'location' FROM myTable 时,它返回 21,000 行,这与我预期的差不多,但它只返回一列。

我想要的是将它们移动到一个新表中,但每场比赛的整行。

我最好的猜测是 SELECT * from (SELECT DISTINCT 'location' FROM myTable) 或类似的东西,但它说我有一个模糊的语法错误。

有没有一种好方法可以一次性抓取每个 DISTINCT 行的其余部分并将其移动到新表中?

【问题讨论】:

  • 有趣的问题标题。 ::thumbup::
  • 投反对票?希望这是由于我的 MySQL 缺乏能力,而不是幽默。 Stack Overflow 不能有幽默感吗?

标签: sql mysql select distinct


【解决方案1】:
SELECT * FROM myTable GROUP BY `location`

或者如果你想移动到另一个表

CREATE TABLE foo AS SELECT * FROM myTable GROUP BY `location`

【讨论】:

  • +1 简明扼要,问了什么;您仍然可以指出 distinct 总是返回不同的行(在所有列中),并且 group by (在 mysql 中)仅对 group by 中提到的列返回不同的行(并随机选择其他非聚合列;这是 mysql 扩展符合标准,因此在其他数据库中的工作方式不同)
【解决方案2】:

返回的整行的不同意味着。所以你可以简单地使用

SELECT DISTINCT * FROM myTable GROUP BY 'location'

在单个列上使用 Distinct 没有多大意义。假设我有以下简单的集合

-id-   -location-
1       store
2       store
3       home

如果有某种查询返回所有列,但只是位置不同,那么将返回哪一行? 1 还是 2?它应该随机选择一个吗?因此,DISTINCT 适用于返回的结果集中的所有列。

【讨论】:

    【解决方案3】:

    嗯,首先你需要决定你真正想要返回什么。

    问题在于,据推测,对于表中的某些位置值,即使位置值相同,其他列中的值也不同:

     Location     OtherCol   StillOtherCol
    
     Place1       1          Fred
     Place1       89         Fred
     Place1       1          Joe
    

    在这种情况下,您要选择三行中的哪一行?当您谈论 DISTINCT 位置时,您将这三行不同的数据压缩为一行,将原始行从原始表移动到新表中没有任何意义,因为这些原始行不再存在于您的 DISTINCT 结果中放。 (如果给定位置的所有其他列始终相同,您的问题就更容易了:只需 SELECT DISTINCT * FROM YourTable)。

    如果您不关心哪些值来自其他列,您可以使用(糟糕的,恕我直言)MySQL 扩展 SQL 并执行以下操作:

    SELECT * FROM YourTable GROUP BY Location

    这将给出一个结果集,每个位置有一行,其他列的值以未定义的方式从原始数据派生。

    【讨论】:

      【解决方案4】:

      所有列中具有相同值的多行没有任何意义。好的 - 这个问题可能是一种纠正这种情况的方法。

      考虑这个表,id是PK:

      kram=# select * from foba;
       id | no |     name      
      ----+----+---------------
        2 |  1 | a
        3 |  1 | b
        4 |  2 | c
        5 |  2 | a,b,c,d,e,f,g
      

      您可以通过对该列进行分组并选择具有最小 PK 的行(例如),为每个单一的 no (:=location) 提取样本:

      SELECT * FROM foba WHERE id IN (SELECT  min (id) FROM foba GROUP BY no); 
       id | no | name 
      ----+----+------
        2 |  1 | a
        4 |  2 | c
      

      【讨论】:

        猜你喜欢
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        • 2011-07-19
        • 2011-04-28
        相关资源
        最近更新 更多