mysql中的多列不同

时间:2009-07-16 14:28:07

标签: mysql optimization distinct group-by

| 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;不能正常工作,因为它在所有行中查找不同的行,在这种情况下会返回所有6行。

理想情况下,我在寻找:

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

在PHP(等)中,我只是为每列使用一个数组,如果之前已经使用了任何列,则跳过该行。我不知道如何在MySQL中实现它。

SELECT * FROM (SELECT * FROM table GROUP BY one) GROUP BY two - 几乎可行。但是因为外部查询没有看到所有替代方案,它将错过有效选项,即内部将折叠为A,B,C但是可以为第二列选择所有 1,这意味着第二个GROUP BY然后将它自己折叠为1行!

我知道重复检查的顺序会对返回的确切行产生影响 - 不用担心 - 我只是想要一个行数较少且行数最少的行。

2 个答案:

答案 0 :(得分:1)

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

CREATE TEMPORARY TABLE table2 ENGINE HEAP SELECT * FROM table;

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

SELECT * FROM table2;

alter table中的IGNORE很重要,因为它只是根据唯一索引 s 丢弃任何重复的行。

(不知道为什么之前没有想到这一点 - 因为在解决“分组前的顺序”样式查询时使用效果很好!)

答案 1 :(得分:0)

在SQL中无法做到这一点:您可以有六行(每个唯一元组),五行(每次第一次使用每个列值)或一行(每一行中每个值的每次首次使用都会出现在两列)。

你有这么困难的时间解释你想要的是它是基于人类判断的呼唤。在用英语定性地描述它之前,你将无法在SQL中执行此操作,并且您想要的不是定性的,而是程序性的。

有很多方法可以近似它,例如按较小列分组然后按匹配计数倒数排序,但它们都可以被利用。

直到你能给出一个明确的,逻辑驱动的选择标准,这将不会成功。在你定义minimal之前说“minimal”并不算数,而你想要的最小值需要程序化的聚合behvaior,这是你无法在MySQL中获得的。