| 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行!
我知道重复检查的顺序会对返回的确切行产生影响 - 不用担心 - 我只是想要一个行数较少且行数最少的行。
答案 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中获得的。