Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Bobinho
30 / 30 / 7
Регистрация: 09.07.2013
Сообщений: 120
1

SELECT WHERE IN с LIMIT с наличием всех переданных значений в столбце

18.11.2013, 10:17. Просмотров 1329. Ответов 10
Метки нет (Все метки)

Всем привет.

Представим, что есть база статей с разными авторами. Этих статей около 30 миллионов.

Перед запросом в БД можно указать чьих авторов хотим показать статьи, т.е. в запросе будет where author_id IN (id авторов)

Задача: сделать запрос в БД с лимитом в 20 тысяч так, чтобы среди этих 20 тысяч встречались статьи всех авторов, которых мы выбрали.

Объясню суть проблемы: предположим, что у автора с ID 1 имеется 100 тысяч первых статей (id статей от 1 до 100 000). И при запросе с лимитом в 20 тысяч вернуться статьи только этого одного автора, а мне нужно, чтобы в эти 20 тысяч еще попали статьи других авторов.

Спасибо!
0
Nabijon
9 / 9 / 0
Регистрация: 15.02.2013
Сообщений: 121
18.11.2013, 11:19 2
можно исползовать группировку по автору но в результате может случиться так что результат будет меньше 20000

примерно так
SELECT * from books GROUP BY autor LIMIT 20000
0
_ViPeR_
603 / 481 / 171
Регистрация: 02.03.2010
Сообщений: 1,194
18.11.2013, 11:21 3
Задача не детерминированная. Как определить сколько статей должно отбираться для каждого из авторов из IN'а?
То есть, например, у одного автора есть 10 статей, у второго 6 и у третьего 8, нужно сделать выбор с лимитом 15 - в этот лимит все статьи уже первого и второго не попадают. Нужно с каждого по 5 статей или с первого 8, со второго 2 и с третьего 5, или еще как?
0
Bobinho
30 / 30 / 7
Регистрация: 09.07.2013
Сообщений: 120
18.11.2013, 12:36  [ТС] 4
Цитата Сообщение от Nabijon Посмотреть сообщение
можно исползовать группировку по автору но в результате может случиться так что результат будет меньше 20000

примерно так
SELECT * from books GROUP BY autor LIMIT 20000
в данном случае будет по 1 статье для каждого автора

Добавлено через 10 минут
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
Задача не детерминированная. Как определить сколько статей должно отбираться для каждого из авторов из IN'а?
То есть, например, у одного автора есть 10 статей, у второго 6 и у третьего 8, нужно сделать выбор с лимитом 15 - в этот лимит все статьи уже первого и второго не попадают. Нужно с каждого по 5 статей или с первого 8, со второго 2 и с третьего 5, или еще как?
Перед этим я делаю еще один запрос, который возвращает мне количество статей для каждого автора, из которых можно посчитать %-соотношение.

Получается:

limit 20000 тысяч.

Автор1 = 50 000 статей
Автор2 = 35 000 статей
Автор3 = 15 000 статей

В идеале, чтобы вернулось:

Автор1 = 10 тысяч (50 тысяч = 50% от от общего кол-ва статей, limit 20 000 / 50% = 10 000)
Автор2 = 7 тысяч
Автор3 = 3 тысячи
0
Nabijon
9 / 9 / 0
Регистрация: 15.02.2013
Сообщений: 121
18.11.2013, 15:08 5
Надо создавать функцию или с помощь какого нибудь языка написать код

Добавлено через 5 минут
Если задача будет вывести данные у 1000 авторов, вы введете 1000 id?
0
Bobinho
30 / 30 / 7
Регистрация: 09.07.2013
Сообщений: 120
18.11.2013, 15:54  [ТС] 6
Цитата Сообщение от Nabijon Посмотреть сообщение
Если задача будет вывести данные у 1000 авторов, вы введете 1000 id?
Да, но тут просто небольшая форма с чекбоксами и авторов всего около 15 штук. Но у одного автора может быть около 16 миллионов записей.
0
Nabijon
9 / 9 / 0
Регистрация: 15.02.2013
Сообщений: 121
19.11.2013, 10:24 7
Если возможно вы описали бы свои таблицы тогда можно было б написать код
0
cygapb-007
1309 / 941 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
19.11.2013, 14:06 8
Долгий способ решения:
1. создать таблицу требуемых авторов (ид автора, число требуемых статей)
2. таблицу со статьями (ид автора, ид статьи) перенумеровать раздельно по каждому автору (возможно, через переменные, возможно, через временную таблицу)
3. перенумерованную таблицу объединить с таблицей требуемых авторов (JOIN) по ид автора и номер по порядку <= число требуемых статей этого автора

Добавлено через 4 минуты
Как вариант - перенумеровать все статьи подряд по возрастанию ид_автор (возможно, с JOIN только по требуемым авторам) и для каждого автора найти минимальный порядковый номер, дальше тот же JOIN с учетом числа требуемых статей и порядкового номера первой статьи в сквозной нумерации без разрывов
0
Nabijon
9 / 9 / 0
Регистрация: 15.02.2013
Сообщений: 121
19.11.2013, 15:53 9
я попытаюсь сделать в рнр...
0
cygapb-007
1309 / 941 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
20.11.2013, 08:49 10
Цитата Сообщение от Nabijon Посмотреть сообщение
я попытаюсь сделать в рнр...
У вас данные хранятся в php?

Добавлено через 16 минут
Еще вариантик:
MySQL
1
2
3
4
5
6
7
8
select @sql:=group_concat(
  concat('(select * from `статьи` where `автор`=',t.`автор`,' limit ',t.qty,')')
  separator ' union all ')
from temp_table t;
 
prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;
0
Nabijon
9 / 9 / 0
Регистрация: 15.02.2013
Сообщений: 121
20.11.2013, 15:56 11
Ваша поставленная задача сложная и решит её только в майскюел не просто

Добавлено через 53 минуты
ну и рнр мне чуток ближе
0
20.11.2013, 15:56
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.