В mysql, как эффективный способ получить только строки в таблице по отдельному значению в одном из столбцов этой таблицы? - PullRequest
2 голосов
/ 04 февраля 2011

Я относительно новичок в MySQL, поэтому терпите меня.

У меня есть таблица, которая выглядит примерно так:

ID | Name | Location  

0  | John | Los Angeles  
1  | Joe  | San Jose  
2  | Jane | New York  
3  | Sal  | Boise  
4  | Jay  | New York  
5  | Kate | San Jose  

Мне нужен оператор SELECT, которыйвсе строки, за исключением того, что, если Location повторяется, эта строка игнорируется.Результат должен выглядеть примерно так:

0  | John | Los Angeles  
1  | Joe  | San Jose  
2  | Jane | New York  
3  | Sal  | Boise  

Важно то, что моя таблица очень, очень большая, с сотнями тысяч строк.Большинство вещей, которые я пробовал, заканчивались утверждениями select, которые занимают буквально 30+ минут!

Ответы [ 4 ]

2 голосов
/ 04 февраля 2011

Вот как бы я это сделал:

SELECT mt1.ID, mt1.Name, mt1.Location 
FROM mytable mt1
JOIN (SELECT MIN(id) AS ID 
        FROM Mytable 
        GROUP BY location) mt2
    ON mt1.id = mt2.Id

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

Между прочим, ID - ужасный выбор для именования поля id. Пожалуйста, подумайте об использовании tablenameID. Это полезно для сообщения об отсутствии одинакового имени для полей идентификаторов в разных таблицах, и это делает, если FAR менее вероятно, что вы допустите ошибку случайного соединения и присоединитесь к идентификатору в неправильной таблице. Это также делает отношения PK / FK легче, по моему мнению.

0 голосов
/ 04 февраля 2011

У вас есть индекс на месте? Это должно значительно улучшить скорость.

0 голосов
/ 04 февраля 2011

вы можете использовать

SELECT * FROM tbl GROUP BY Location

Создание индекса для Location может существенно помочь сократить время запроса.

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

0 голосов
/ 04 февраля 2011
SELECT ID, Name, Location
FROM table
GROUP BY Location
...