Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
3 / 3 / 0
Регистрация: 03.10.2013
Сообщений: 85

Выбирать из базы без повторов за сессию

22.05.2014, 22:04. Показов 1971. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, написал небольшой движок для проекта, но есть одна проблема... Зашедший пользователь, или авторизированный может рандомно пролистывать фото, что рандомно грузятся с помощью Аякса. Если использовать разные методы рандомной выборки средствами mysqli то результат ужасный, за раз может попасть одно и тоже фото 5 раз) При условии что фотографий 10. Как лучше сделать случайное фото без показов повторов, из тех которые на данный момент в базе (они могут увеличиться в любой момент) Вот как сейчас вытаскивается

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function action_load()
{
    include_once($_SERVER["DOCUMENT_ROOT"] . "/includes/db_connect.php");
 
 
    if ($stmt = $mysqli->prepare("SELECT url FROM files ORDER BY RAND() LIMIT 1")) {
        $stmt->execute();
        $stmt->bind_result($url);
        $stmt->fetch();
        $stmt->close();
    }
    $mysqli->close();
 
 
    echo 'хтмл часть с фоткой по адресу $url';
 
}
Как реализовать вывод без повторов? Дело в том, что всякие варианты с подобными рандомными запросами я перепробовал... Как бы это к сессии прикрепить... Но если много картинок в базе и это сколько же ее нужно гонять по кругу пока найдется не просмотренная... Подскажите как сделать и не нагружено и исключить повторы...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.05.2014, 22:04
Ответы с готовыми решениями:

Выбирать из директории без повторов, если были выбраны все то заного начинать
Добрый день, я верстальщик, поэтому не ругайте ) В общем я делаю следующее... Есть страница на которой имеются табы, например TAB_1 и...

Перегнать данные из любого файла с разделителями в таблицу базы данных (без повторов)
Здравствуйте. В университете дали задание по sql. СУБД Oracle. Необходимо перегнать данные из любого файла с разделителями в таблицу...

Рандом без повторов
Как реализовать получение нового целого числа в диапазоне от 1 до 10 при нажатии на button1 без повторов? Помогите пожалуйста.

21
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
23.05.2014, 13:25
MySQL
1
... where `url` <> 'текущий' ORDER BY RAND()
0
3 / 3 / 0
Регистрация: 03.10.2013
Сообщений: 85
23.05.2014, 14:50  [ТС]
Цитата Сообщение от crautcher Посмотреть сообщение
MySQL
1
... where `url` <> 'текущий' ORDER BY RAND()
Ну это будет без повтора текущего. И вероятность того, что будет например из десяти показываться 5 7 5 7 5 7. Ведь под условие это попадает) А как бы реализовать исключение повторов за сессию? Если например сохранять в массив и хранить в сессии, а потом при выборке проверять есть ли такой урл в массиве и если есть рандомить заного... Мне кажеться, что так очень громозко и неправильно(

Добавлено через 43 минуты
Цитата Сообщение от crautcher Посмотреть сообщение
MySQL
1
... where `url` <> 'текущий' ORDER BY RAND()
Может как то так? Или гдето рядом?

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// $urlView если не смотрели еще то определим переменную
if (unset($urlView)) {
$urlView = "";
}
else $urlView = $_SESSION['urlWiew']
 
// Здесть MySQLi рандомим url
 
 
if (in_array($url, $urlView)) {
// Если $url уже есть в массиве MySQLi рандомить заного url
}
 // Добавляем в массим урл и записваем в сессию
$urlView = array_unique($url);
$_SESSION['urlWiew'] = $urlView;
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
23.05.2014, 15:17
Цитата Сообщение от YozUP Посмотреть сообщение
И вероятность того, что будет например из десяти показываться 5 7 5 7 5 7. Ведь под условие это попадает
Это и значит случайность
Цитата Сообщение от YozUP Посмотреть сообщение
Если например сохранять в массив и хранить в сессии,
Лучше в куках браузера, зачем серверу держать у себя эти данные?
Цитата Сообщение от YozUP Посмотреть сообщение
грузятся с помощью Аякса
Ну так в джавскрипте храните уже просмотренные фото и отправляйте их обработчику.
0
3 / 3 / 0
Регистрация: 03.10.2013
Сообщений: 85
23.05.2014, 15:34  [ТС]
Цитата Сообщение от crautcher Посмотреть сообщение
Это и значит случайность
Лучше в куках браузера, зачем серверу держать у себя эти данные?Ну так в джавскрипте храните уже просмотренные фото и отправляйте их обработчику.
А какой принцип если хранить в javascript? Тоесть сейчас так - user нажимае кнопку па onclick показать фото, идет запуск функции где аяксом идет отправка параметра "action=load" по xmlhttp.open на php файл, этот парамерт говорит в php файле о том, что нужно запустить выюорку из Mysqli... Что то крутиться на уме) Но не соображу) Дапустим массив просмотренных будет храниться в javascript и при обращении к php файлу фяксом передавать еще один парамерт о том какие просмотренные (массив) И выборку делать из любых, кроме тех которые просмотренные... И тут я запутался и каша в голове)))
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
23.05.2014, 15:45
Цитата Сообщение от YozUP Посмотреть сообщение
Дапустим массив просмотренных будет храниться в javascript и при обращении к php файлу фяксом передавать еще один парамерт о том какие просмотренные (массив) И выборку делать из любых, кроме тех которые просмотренные..
Ну в теории именно так
0
3 / 3 / 0
Регистрация: 03.10.2013
Сообщений: 85
23.05.2014, 15:54  [ТС]
Цитата Сообщение от crautcher Посмотреть сообщение
Ну в теории именно так
В теории все законы для жителей страны))) А в реальности я в полуразваленом доме живу и плевать чиновники хотели) Вот ка бы эту теорию сконвертировать в практику) Если бы это был Бейсик, я бы в строке 50 сделал выборку из базы и если такой урл уже есть в массиве который пришел по POST я бы погнал GO TO 50 по кругу) Пока база бы не взорвалась) Вот как сделать эту проверку постоянно не гоняя базу?
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
23.05.2014, 16:02
Цитата Сообщение от YozUP Посмотреть сообщение
Вот как сделать эту проверку постоянно не гоняя базу?
Так при 10 картинках, какая это нагрузка? А при 10000 шанс повтора 1 к 10000 и все это не нужно.
0
3 / 3 / 0
Регистрация: 03.10.2013
Сообщений: 85
23.05.2014, 16:08  [ТС]
Просто хотелось не ограничиваться зависимостью количества. Да и так, для себя. Так как много до этого смотрел и заметил, что проблема яркая. То есть многие что только не вытворяют для рандома такого плана. Вот и стало интересно... Не ужели нет простого решения для подобных ситуаций?

Добавлено через 45 секунд
Цитата Сообщение от crautcher Посмотреть сообщение
Так при 10 картинках, какая это нагрузка? А при 10000 шанс повтора 1 к 10000 и все это не нужно.
Просто хотелось не ограничиваться зависимостью количества. Да и так, для себя. Так как много до этого смотрел и заметил, что проблема яркая. То есть многие что только не вытворяют для рандома такого плана. Вот и стало интересно... Не ужели нет простого решения для подобных ситуаций?
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
23.05.2014, 16:15
Чтобы базу не гонять, можно выбрать максимальный айди, передать его в js (скажем 181). Js делает массив от 0 ... до 181. Выбирает случайный элемент - 77. Говорит пхп, что нужна пачка фоток вокруг 77. PHP выбирает данные где айди больше (или меньше) 77 и возвращает 5 фоток и их айди джаваскрипту. Js уничтожает в своем массиве айди использованные. Выбирает еще один случайный айди из массива...

Добавлено через 2 минуты
В общем идея немного сырая, только придумал, но смысл, чтобы js вел аналитику, а php доставал лишь нужное
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
23.05.2014, 16:20
Цитата Сообщение от crautcher Посмотреть сообщение
максимальный айди
имхо, не лучшая идея. Фотки могут удаляться, и может получиться так, что максимальный id, к примеру, 200, а картинок всего полтинник.. Проблематично будет. Лучше подсчитать число записей через COUNT(), а затем выводить с помощью LIMIT. Если ничего страшного не будет, если фотографии выводятся не 100% рандомно, а по порядку с рандомной позиции - то ничего сложного. Иначе идеи кроме как хранить, как минимум, все id-шники в памяти (в js или сессии/куки, файлы и т.п.) в голову не приходит..
0
3 / 3 / 0
Регистрация: 03.10.2013
Сообщений: 85
23.05.2014, 16:24  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
имхо, не лучшая идея. Фотки могут удаляться, и может получиться так, что максимальный id, к примеру, 200, а картинок всего полтинник.. Проблематично будет. Лучше подсчитать число записей через COUNT(), а затем выводить с помощью LIMIT. Если ничего страшного не будет, если фотографии выводятся не 100% рандомно, а по порядку с рандомной позиции - то ничего сложного. Иначе идеи кроме как хранить, как минимум, все id-шники в памяти (в js или сессии/куки, файлы и т.п.) в голову не приходит..
Все правильно. Не подойдет... Фотки могут добавиться или удалиться другими пользователями в этот момент... И id поэтому не 1 2 3 4 5 а может быть так 5 7 8 33 47 121
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
23.05.2014, 16:30
Цитата Сообщение от KOPOJI Посмотреть сообщение
имхо, не лучшая идея. Фотки могут удаляться, и может получиться так, что максимальный id, к примеру, 200, а картинок всего полтинник..
И что?
MySQL
1
where id > '$x' limit 5
и плевать каких нет
0
3 / 3 / 0
Регистрация: 03.10.2013
Сообщений: 85
23.05.2014, 16:33  [ТС]
Даже если сделать как говорит KOPOJI Вытащить все то можно конечно все их занести в массив перемешать shuffle и потом отдавать. Тоесть как только новый юзер пришел ему вписать (в js или сессии/куки, файлы и т.п.) этот массив число записей через COUNT()... А не так уже не пойдет через shuffle... Блин
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
23.05.2014, 16:41
Цитата Сообщение от KOPOJI Посмотреть сообщение
затем выводить с помощью LIMIT
И будут запросы
MySQL
1
.. limit 10000, 5
? Бред. По айди в разы меньше нагрузка.
0
3 / 3 / 0
Регистрация: 03.10.2013
Сообщений: 85
23.05.2014, 17:19  [ТС]
Цитата Сообщение от crautcher Посмотреть сообщение
И что?
MySQL
1
where id > '$x' limit 5
и плевать каких нет
Здесь я не совсем понимаю логику... Можно подробней? И почему лимит именно 5?
0
23.05.2014, 17:40

Не по теме:

Цитата Сообщение от YozUP Посмотреть сообщение
И почему лимит именно 5?
Это я не конкретно к вашему случаю, а просто пример какого-то лимита с большим сдвигом

0
3 / 3 / 0
Регистрация: 03.10.2013
Сообщений: 85
24.05.2014, 13:38  [ТС]
Цитата Сообщение от crautcher Посмотреть сообщение

Не по теме:


Это я не конкретно к вашему случаю, а просто пример какого-то лимита с большим сдвигом

В итоге как я понимаю нет однозначного решения на подобную тему( Я вот и до этого где только не смотрел... Проблема для подобных вещей частая и решения для одной задачи превращаются в "Битву") Как таковой простой фичи нет казалось бы для мелочи. В принципе все это я и думал, но надеялся на протопанные тропы) Я понимаю для каждой задачи свое решение, но ... Придется задуматься) И немного не в тему, вчера случайно наткнулся на толи как я понял блогера-учителя который продает курсы по питону) То что он, а он так гнал))) Там для тех кому он пытался продать свой курс тем кто только определяются с языком, привел такой факт, что python это единственный язык программирования на котором можно посчитать бюджет России) И только на питоне можно сделать портал) Потому что - Цитирую))) Пэшэпэ и сырой флэш для простых сайтов) И привел буквальный пример) Тут я и упал) Пример:
ппппппппппппппппппппппппппппппп (это любой язык не питон)
пппппп (Это питон!!!)
И после этого он прокричал в видео))) Видите разницу! И поэтому я вам советую питон))) Продолжив доказательства и показав в видео гугл) говоря - Гугл это мощь и гугл на питоне а там не дураки)
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
24.05.2014, 13:59
Цитата Сообщение от YozUP Посмотреть сообщение
Пэшэпэ и сырой флэш для простых сайтов)
вы это пишете на "простом сайте", написанном на "пэшепэ"
Цитата Сообщение от YozUP Посмотреть сообщение
Это питон
всяк кулик свое болото хвалит Найдите рельсовика, он вам тоже самое скажет относительно RoR, а питон и пых опустит.
Цитата Сообщение от YozUP Посмотреть сообщение
гугл на питоне
Гугл не только на питоне - там используются C, C++, Go, Java, Python. Yahoo на пыхе. Википедия на пыхе. Ebay на яве. Github на RoR. Это не означает, что какой-то из этих языков лучше или хуже. У всех есть свои плюсы и минусы. Вопрос только в удобстве разработки, популярности и квалифицированности самого программиста в области конкретного языка
0
3 / 3 / 0
Регистрация: 03.10.2013
Сообщений: 85
24.05.2014, 14:59  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
вы это пишете на "простом сайте", написанном на "пэшепэ"

всяк кулик свое болото хвалит Найдите рельсовика, он вам тоже самое скажет относительно RoR, а питон и пых опустит.

Гугл не только на питоне - там используются C, C++, Go, Java, Python. Yahoo на пыхе. Википедия на пыхе. Ebay на яве. Github на RoR. Это не означает, что какой-то из этих языков лучше или хуже. У всех есть свои плюсы и минусы. Вопрос только в удобстве разработки, популярности и квалифицированности самого программиста в области конкретного языка
Как ты буквально принял) А как же про то, что только на питоне можно посчитать бюджет России)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.05.2014, 14:59
Помогаю со студенческими работами здесь

Выделения без повторов
Как выделить из таблицы game7 avatar но без повторов.

Рандом без повторов
Ребят подскажите как можно срандомить с числа 100 допустим 30 чисел которые не будут повторятся.

Вставка без повторов
Привет! Таблица: id | unique | status status default 0 - для тех которые были добавлены впервые. Как лучше сделать вставку...

Запрос на добавление без повторов
Доброго времени суток! База &quot;Периодические медицинские осмотры&quot; (ПМО) Согласно приказу, каждому вредному фактору соответствует определенный...

Добавление в файл без повторов
Есть некий файл 1.txt, необходимо добавить в него новую строчку, при условии того что такой строчки еще не было, помогите сделать плз...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru