опять мускуль

12
malls
На сайте с 08.08.2005
Offline
255
762

такой вопрос - есть две таблицы, вторая привязана к первой:

first

---------------
| id | data |
1 ...
2 ...
3 ...
4 ...
5 ...
6 ...
7 ...
8 ...
---------------

и second
---------------------------
| id | id_first | data |
1 2 ...
2 2 ...
3 3 ...
4 3 ...
5 7 ...
6 7 ...
7 8 ...
8 1 ...
---------------------------

есть список значений id из первой таблицы, например, (2,3,5,6) нужно выбрать для этих ID данные из первой и второй - это просто:

SELECT first.id,first.data,  second.id, second.data

FROM first,second
WHERE first.id IN (2,3,5,6)
AND second.id_first=first.id

Но как выбрать так чтобы из второй таблицы бралось только 5 записей для каждого id из первой? Т.е. чтобы из второй выбиралось для:

first.id=2 - только 5 записей из second

first.id=3 - только 5 записей из second

first.id=5 - только 5 записей из second

first.id=6 - только 5 записей из second

Т.е. нужен LIMIT - но не общий, а как бы только для каждой выборки из второй таблицы...

N
На сайте с 06.05.2007
Offline
419
#1

объединять с подзапросом разве что .

select first.*,second.data

from first, (select data from second where id_first =first.id limit 5) as second

Кнопка вызова админа ()
malls
На сайте с 08.08.2005
Offline
255
#2

в таком вариаете кочевряжится, пробовал уже, пишет ошибку

mysql_query: Unknown column 'first.id' in 'where clause'

оно и понятно - для этого подзапроса first.id просто не существует.

[Удален]
#3

Чёт как-то задавался такой проблема, так и не решил, тоже интересно

[Удален]
#4

Через переменные можно сделать но тормозить будет на большой базе.

Слушайте, malls, откуда вы такие извращенные задачи берете?

[Удален]
#5
neolord:
Слушайте, malls, откуда вы такие извращенные задачи берете?

Ага тоже интересно, что за мега скрипты постоянно юзаешь )))

malls
На сайте с 08.08.2005
Offline
255
#6
neolord:
Слушайте, malls, откуда вы такие извращенные задачи берете?

Опыт! :) Как говорится "свинья грязи найдет", так что был бы экспириенс (в наживании геморов) - а остальное приложится.

Ну правда прямо скажем это и неплохо - развивает мозги! :)

KosoyRoman:
Ага тоже интересно, что за мега скрипты постоянно юзаешь )))

не скажу... :)

на самом деле не столько скрипты мега - сколько базы основательные... Поэтому все что может привести к упрощению выборок - весьма даже интересно.

ЗЫ: по теме пока понял только что для таких выборок (это как бы циклическая выборка получается) можно юзать только такую фичу из 5-го мускуля как "хранимые процедуры" - они позволяют как бы создавать скриптинг "на уровне мускуля" и к его работе обращаться.

Но в эти дебри лезть не хочу пока, поищу попроще пути.

KosoyRoman если интересно можешь про них вот отсюда узнать немного.

[Удален]
#7

Можно переменной считать кол-во выбранных из first id, потом джойнить, потом сортировать как нить по второй переменной и делать limit 5*@varname - изврат

Процедуры в mysql вообще зло. Они медленные и дампить их неудобно. но в данном случае похоже не избежать

malls
На сайте с 08.08.2005
Offline
255
#8

А кстати можно делать сортировку по двум полям не последовательно, а одновременно?

Т.е. как бы не

ORDER BY f1,f2

а

ORDER BY f1+f2

----------------

UPD да кажется прокатывает

N
На сайте с 06.05.2007
Offline
419
#9

ой да. так не получится, зато получится выбрать ид записей в second и прилепить их через where in ().

однако у меня такой запрос в mysql 5.0 выдает

ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

так что все гораздо хуже.

Получается проще на php в цикле. Иначе придется изучать процедуры и курсоры в mysql.

malls
На сайте с 08.08.2005
Offline
255
#10
netwind:
Получается проще на php в цикле. Иначе придется изучать процедуры и курсоры в mysql.

В цикле нет... На эти грабли с памятью в прошлый раз наступил. В первой таблице 200 записей, а во второй пара миллионов. Эта пара миллионов удавит скрипт как класс. А по другому придумал - мне надо не больше пяти любых записей для каждого ID - берем лимит 1000 но рандомной сортировкой...

Получаем примерно 1000 / 200 ~ 5 записей на каждый ID (это статистика) - лишние уже отбрасываем скриптом - и волки целы и овцы сыты. Потом просто уже юзаным записям флаги расставляем чтоб в следующую выборку не попадали.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий