Понедельник, 25 Ноября 2024, 11:21

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Выборка из двух огромных таблиц mysql.
zxc76Дата: Пятница, 31 Октября 2014, 18:21 | Сообщение # 1
39DLL Rulezz
Сейчас нет на сайте
Основной ЯП- php, речь идет о сайте.

Есть два таблицы:
1)Таблица с заказами, содержит: ид заказа
2)Таблица с выполненными заказами, содержит: ид пользователя, и ид заказа который он выполнил.
Соответственно вторая таблица во много раз больше первой.
Предположим для пользователя с ИД 2 нужно найти заказ из таблицы с заказами, который этот пользователь ещё не выполнил, то есть выбранный для него заказ не должен быть во второй таблице.

Я нашел два очевидных варианта решения.

Первый вариант:
Подгрузить все заказы с таблицы заказов.
Подгрузить все выполненные заказы пользователем 2, из второй таблицы.
Сравнить уже внутри программы.

Второй вариант:
q="SELECT * FROM тб_заказы"
while(пока не пройдем всем q)
{
если не существует "SELECT * FROM тб_выполненные_заказы WHERE выполнил=2" {
то даем этот заказ;
break;
}

}

Третий вариант:
Мы находим первым или вторым способом, заказ. По возрастанию ИД. Запоминаем ИД заказа который даем.
И когда нужно найти новый заказ, начинаем с этого номера.

Всё усложняется тем, что есть несколько типов заказов, и обе таблицы всё время увеличиваются.

Какой из первых двух вариантов оптимальнее?
Если есть более оптимальный вариант, то пожалуйста предложите его.

Один заказ, могут выполнить все пользователи системы. То есть заказ можно выполнить не ограниченное количество раз.

Заранее благодарен за помощь))))


PHP

Сообщение отредактировал zxc76 - Пятница, 31 Октября 2014, 18:38
lvovandДата: Пятница, 31 Октября 2014, 18:30 | Сообщение # 2
старожил
Сейчас нет на сайте
zxc76, в первой таблице сделать поле статуса, скажем по-умолчанию 0, а если кто-то взял то менять на 1
и тогда для пользователя выборка заказов
SELECT * FROM `table1` WHERE `status` = 0 AND `id` NOT IN (SELECT `id_zakaz` FROM `table2` WHERE `id_user` = '".$user."' )

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


Разработка и продвижение сайтов. Дизайн

Сообщение отредактировал lvovand - Пятница, 31 Октября 2014, 18:31
zxc76Дата: Пятница, 31 Октября 2014, 18:36 | Сообщение # 3
39DLL Rulezz
Сейчас нет на сайте
Извиняюсь, я совершенно забыл сказать, что один заказ может выполнить каждый пользователь. То есть поле статуса в первой таблицы сделать нельзя(

PHP
lvovandДата: Суббота, 01 Ноября 2014, 08:49 | Сообщение # 4
старожил
Сейчас нет на сайте
Цитата zxc76 ()
один заказ может выполнить каждый пользователь

ну можно и
SELECT * FROM `table1` WHERE 1 AND `id` NOT IN (SELECT `id_zakaz` FROM `table2` WHERE `id_user` = '".$user."' )

смотря уже каким количеством данных оперировать, если сотни записей, то никаких проблем, если миллионы, то что-то придется менять в задумке.
Все равно наеврно заказы не вечные и чем-то ограничены?


Разработка и продвижение сайтов. Дизайн

Сообщение отредактировал lvovand - Суббота, 01 Ноября 2014, 08:50
zxc76Дата: Суббота, 01 Ноября 2014, 12:23 | Сообщение # 5
39DLL Rulezz
Сейчас нет на сайте
lvovand, спасибо))

Мне ещё один вариант скинули. Lucasito
SELECT zakaz.id FROM zakaz Left JOIN task on (task.id_zakaz=zakaz.id and task.id_user='нужный нам id пользователя') WHERE task.id_user is null

Тема закрыта)


PHP
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг