Multi столбец отличается в MySQL - PullRequest
2 голосов
/ 16 июля 2009
| 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 ]

1 голос
/ 24 июля 2009

Ну, как оказалось, я нашел ответ;)

CREATE TEMPORARY TABLE table2 ENGINE HEAP SELECT * FROM table;

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

SELECT * FROM table2;

IGNORE в таблице alter важен, поскольку он просто отбрасывает любые дублирующиеся строки на основе уникального индекса s .

(не уверен, почему не подумал об этом раньше - так как это эффективно использовалось при решении запросов в стиле «порядок перед группой»!)

0 голосов
/ 24 июля 2009

Нет никакого способа сделать это в SQL: у вас может быть шесть строк (каждый уникальный кортеж), пять строк (каждое первое использование каждого значения столбца) или одна строка (каждое первое использование каждого значения в каждом столбце, который появляется в обе колонки).

Причина, по которой вам так сложно объяснить, чего вы хотите, заключается в том, что это основано на человеческом суждении. Вы не сможете сделать это в SQL, пока не сможете качественно описать это на английском, а то, что вы хотите, не качественно, а процедурно.

Существует множество способов приблизить его, например, группировать по младшему столбцу, а затем сортировать по обратному количеству совпадений, но все они пригодны для использования.

Пока вы не сможете дать однозначный, управляемый логикой критерий выбора, это не будет успешным. Выражение «минимальный» не считается до тех пор, пока вы не определите минимальный, а минимальный, который вам нужен, требует процедурного агрегатного бэваиора, которого вы не можете получить в MySQL.

...