代码之家  ›  专栏  ›  技术社区  ›  barryhunter

mysql中的多列独立

  •  2
  • barryhunter  · 技术社区  · 15 年前
    | one | two |
    -------------
    | A   | 1   |
    | A   | 2   |
    | B   | 1   |
    | B   | 3   |
    | C   | 1   |
    | C   | 4   |
    

    我希望查询中的任何列都不重复,因此 SELECT DISTINCT one,two FROM table; SELECT * FROM table GROUP BY one,two; 不太有效,因为它在所有行中查找distinct,在本例中将返回所有6行。

    理想情况下,我正在寻找:

    | one | two |
    -------------
    | A   | 1   |
    | B   | 3   |
    | C   | 4   |
    

    SELECT * FROM (SELECT * FROM table GROUP BY one) GROUP BY two -几乎奏效了。但是,由于外部查询没有看到所有的选项,它将丢失有效的选项,即内部查询将塌陷为A、B、C,但可能会选择正确的选项 全部的 第二列为1s,这意味着第二个GROUP BY会将其自身折叠为1行!

    我知道重复检查的顺序会对返回的确切行产生影响——不用担心——我只需要一个具有最小相似行的行的良好横截面。

    2 回复  |  直到 15 年前
        1
  •  1
  •   squiddle    15 年前

    事实证明我找到了答案;)

    CREATE TEMPORARY TABLE table2 ENGINE HEAP SELECT * FROM table;

    ALTER IGNORE TABLE table2 ADD UNIQUE (one), ADD UNIQUE (two);

    SELECT * FROM table2;

    alter表中的IGNORE很重要,因为它只是基于唯一索引丢弃任何重复的行 .

        2
  •  0
  •   John John    15 年前

    你很难解释你想要什么的原因是它基于人类的判断。除非你能用英语定性地描述它,否则你不能用SQL来做这件事,你想要的不是定性的,而是过程性的。

    有一系列的方法来近似它,比如按较小的列分组,然后按匹配计数倒数排序,但是它们都是可以利用的。

    除非您能给出一个明确的、逻辑驱动的选择标准,否则这将不会成功。在您定义minimal之前,说“minimal”并不重要,而您似乎想要的最小值需要过程聚合behvaior,这在MySQL中是无法获得的。