Я ОТЛИЧНО ненавижу MySQL (помогите построить запрос) - PullRequest
3 голосов
/ 21 апреля 2010

Это верный шаг, я верю:

У меня есть таблица с 30000 строк. Когда я SELECT DISTINCT 'location' FROM myTable, он возвращает 21 000 строк, что я и ожидал, но он возвращает только один столбец.

То, что я хочу, это переместить их в новую таблицу, но целую строку для каждого совпадения.

Мое лучшее предположение - что-то вроде SELECT * from (SELECT DISTINCT 'location' FROM myTable) или что-то в этом роде, но там говорится, что у меня есть неопределенная синтаксическая ошибка.

Есть ли хороший способ захватить оставшуюся часть каждой строки DISTINCT и переместить ее в новую таблицу за один раз?

Ответы [ 4 ]

8 голосов
/ 21 апреля 2010
SELECT * FROM myTable GROUP BY `location`

или если вы хотите перейти к другому столу

CREATE TABLE foo AS SELECT * FROM myTable GROUP BY `location`
2 голосов
/ 21 апреля 2010

Отличительные средства для всей возвращаемой строки. Так что вы можете просто использовать

SELECT DISTINCT * FROM myTable GROUP BY 'location'

Использование Distinct для одного столбца не имеет большого смысла. Допустим, у меня есть следующий простой набор

-id-   -location-
1       store
2       store
3       home

если бы был какой-то запрос, который вернул все столбцы, но только по местоположению, какая строка будет возвращена? 1 или 2? Должен ли он просто выбрать один наугад? Из-за этого DISTINCT работает для всех возвращаемых столбцов в наборе результатов.

1 голос
/ 21 апреля 2010

Ну, во-первых, вам нужно решить, что вы действительно хотите вернуть.

Проблема в том, что, по-видимому, для некоторых значений местоположения в вашей таблице есть другие значения в других столбцах, даже если значение местоположения одинаково:

 Location     OtherCol   StillOtherCol

 Place1       1          Fred
 Place1       89         Fred
 Place1       1          Joe

В таком случае, какую из трех строк вы хотите выбрать? Когда вы говорите о расположении DISTINCT, вы объединяете эти три строки разных данных в одну строку, нет смысла перемещать исходные строки из исходной таблицы в новую таблицу, поскольку эти исходные строки больше не существуют в результате DISTINCT. задавать. (Если все остальные столбцы всегда одинаковы для данного местоположения, ваша проблема проще: просто ВЫБЕРИТЕ DISTINCT * FROM YourTable).

Если вам все равно, какие значения поступают из других столбцов, вы можете использовать (плохо, IMHO) расширение MySQL для SQL и выполнить:

ВЫБРАТЬ * ИЗ ГРУППЫ YourTable ПО Расположение

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

0 голосов
/ 21 апреля 2010

Несколько строк с одинаковыми значениями во всех столбцах не имеют никакого смысла. Хорошо - вопрос может быть способом исправить именно эту ситуацию.

С учетом этой таблицы с идентификатором PK:

kram=# select * from foba;
 id | no |     name      
----+----+---------------
  2 |  1 | a
  3 |  1 | b
  4 |  2 | c
  5 |  2 | a,b,c,d,e,f,g

Вы можете извлечь образец для каждого отдельного номера (: = местоположение), сгруппировав этот столбец и выбрав строку с минимальным PK (например):

SELECT * FROM foba WHERE id IN (SELECT  min (id) FROM foba GROUP BY no); 
 id | no | name 
----+----+------
  2 |  1 | a
  4 |  2 | c
...