Вопрос по MySQL?

Выручайте. Есть таблица вида:

surname | subject

Иванов | Физкультура

Иванов | Биология

Петров | Физкультура

Сидоров | Физкультура

Сидоров | Биология

Сидоров | Математика

Алексеев | Математика

Алексеев | Биология


и т.д.


Т.е. одной уникальной фамилии может соответствовать несколько разных предметов. Таблица достаточно большая (около 170 000 строк).

Вопрос: как выбирать по очереди все строки вместе с предметами, содержащие 3 уникальных фамилии.


Т.е. для примера (для первой выборки) результат должен быть:


Иванов | Физкультура

Иванов | Биология

Петров | Физкультура

Сидоров | Физкультура

Сидоров | Биология

Сидоров | Математика


Первая мысль была — вложенный запрос, чтобы в нем выбрать уникальные фамилии с лимитом n,3 и, затем, во внешнем запросе все строки, где фамилии совпадают с выбранными. Оказалось, во вложенных запросах LIMIT не работает :(


Подскажите, пожалуйста, как решить такую задачу. Если есть варианты, интересует решение лучшее по быстродействию. Спасибо.

Upd: Имеется ввиду, что надо за один раз выбирать 3 уникальных фамилии, начиная с n-ной. Т.е. если бы вложенные запросы с limit работали, было бы примерно так:


select * from testid where surname in (select distinct surname from testid order by surname limit 0,3)


select * from testid where surname in (select distinct surname from testid order by surname limit 3,3)


select * from testid where surname in (select distinct surname from testid order by surname limit 6,3)
  • Вопрос задан
  • 2863 просмотра
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
//Уникальная фамилия… Где ж вы таких нашли-то?

select * /*не делайте так, указывайте явно поля*/ from testid join (select surname from testid group by surname limit 0,3) as uniqsurnames using (surname)
Хотя я довольно смутно понял, что вы хотите, но объединение с запросом гораздо лучше подзапроса из-за тупящего оптимизатора mysql.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@edogs
1) В свежих мускулах лимит во вложенных работает вроде как.
2) Если мускул не свежий, можно делать выборку во временную таблицу, потом аппелировать к ней.
3) Честно говоря решение со вложенным запросом кажется утяжеленным в любом случае.
3) Задачу Вы ставите как «3 уникальных фамилии», однако в примере решения Сидоров=3, Петров=1, Иванов=2… а пример с вложенным селектом (n,n+3) подразумевает вообще не понятно что:) Вам надо «не больше 3»?
4)
select * from testid where surname in (
SELECT surname FROM `testid` WHERE 1
group by surname having count(subject)<=3
)
Во вложенном — выбираете все фамилии которые встречаются меньше 4 раз, и потом выбираете все данные с этими фамилиями.
Ответ написан
m08pvv
@m08pvv
А для этой задачи случайно не подойдёт использовать курсор? Или я неправильно понял условие?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы