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

我想在查询的任何列中都没有重复,所以标准 SELECT DISTINCT one,two FROM table; orSELECT * 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 行!

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

4

2 回答 2

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丢弃任何重复的行。

(不知道为什么以前没有想到这一点——因为它在解决“分组前排序”样式查询中效果很好!)

于 2009-07-24T10:19:50.220 回答
0

在 SQL 中没有办法做到这一点:你可以有六行(每个唯一的元组)、五行(每列值的每次第一次使用)或一行(每列中出现在两列中的每个值的每次第一次使用) .

你很难解释你想要什么的原因是它基于人类的判断。在您能够用英语定性地描述它之前,您将无法在 SQL 中执行此操作,并且您想要的不是定性的,而是程序性的。

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

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

于 2009-07-23T22:30:14.500 回答