Т.е. одной уникальной фамилии может соответствовать несколько разных предметов. Таблица достаточно большая (около 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)
select * /*не делайте так, указывайте явно поля*/ from testid join (select surname from testid group by surname limit 0,3) as uniqsurnames using (surname)
Хотя я довольно смутно понял, что вы хотите, но объединение с запросом гораздо лучше подзапроса из-за тупящего оптимизатора mysql.
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 раз, и потом выбираете все данные с этими фамилиями.
Спасибо за ответ! Я имел ввиду, что хочу за один раз выбирать 3 уникальных фамилии, начиная с n-ной. Т.е. если бы вложенные запросы у меня работали, было бы примерно так:
select * from testid where surname in (select distinct surname from testid order by surname limit 0,3)