Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 1 сложный запрос или несколько простых?  [new]
PavelRemm
Member

Откуда:
Сообщений: 3
Есть 3 таблицы:
users (id, type, online),
colors(id,name),
user_colors(user_id, color_id)

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

У меня алгоритм примерно такой получился.
<?php
$result = SELECT * id FROM users WHERE type = $type AND online = true;
$result = SELECT * color_id FROM user_colors WHERE id = массив id который вернет первый запрос
$result = SELECT * name FROM colors WHERE id = массив color_id который вернет второй запрос


Можно ли это все сделать одним запросом? Пример пожалуйста.
Что будет лучше с точки зрения производительности, 3 таких запроса или 1 большой и страшный(если он возможен).


Поправите ошибки в синтаксисе, мой вариант все равно не работает.
Второй запрос может/будет возвращать дубликаты, можно ли в запросе это ограничить?
30 сен 17, 23:29    [20833948]     Ответить | Цитировать Сообщить модератору
 Re: 1 сложный запрос или несколько простых?  [new]
vkle
Member

Откуда: Самара
Сообщений: 13474
PavelRemm
Можно ли это все сделать одним запросом? Пример пожалуйста.

Навскидку, как-то так примерно:
SELECT DISTINCT `colors`.`name`
FROM `users`
JOIN `user_colors` ON `users`.`id` = `user_colors`.`user_id`
JOIN `colors` ON `colors`.`id` = `user_colors`.`color_id`
WHERE `users`.`type` = $type AND `users`.`online` = 1


PavelRemm
Что будет лучше с точки зрения производительности, 3 таких запроса или 1 большой
Задача довольно проста. Насколько понимаю, на клиенте не предусматривается никакой обработки данных между запросами. В таком случае, не вижу смысла гонять данные между сервером и клиентом. Какой-то явно ощутимой разницы в производительности при указанных структурах таблиц вряд ли найдете. Индексы правильно проставить необходимо в любом случае.

PS: А нафига нужен просто список цветов безотносительно привязки к конкретным пользователям? "Раскрасить" пользователей своими цветами - понятная задача, а свалить цвета активных пользователей в одну кучу - не вполне.
1 окт 17, 00:30    [20834013]     Ответить | Цитировать Сообщить модератору
 Re: 1 сложный запрос или несколько простых?  [new]
PavelRemm
Member

Откуда:
Сообщений: 3
'Цвет' - аналогия для упрощения вопроса.

Есть 2 типа пользователей (Тип 1, Тип 2).
Пользователь типа-1 при регистрации на сайте выбирает из списка "Цвет" несколько пунктов.
Пример:
Список 1.зеленый, 2.черный, 3.красный 4.синий ....
Пользователь может выбрать один или больше вариантов.

Есть форма для пользователей типа-2 в которой есть тег <select>
Его нужно заполнить только теми 'Цветами' которые выбрали пользователи типа-1 при регистрации и которые в данный момент онлайн на сайте.

Вот у меня и получилось 3 таблички.
Таблица user_colors - связующая между двумя другими. Типо связь (многие ко многим).
Я это понял так. Если я ошибаюсь, пожалуйста поправте.
1 окт 17, 01:21    [20834039]     Ответить | Цитировать Сообщить модератору
 Re: 1 сложный запрос или несколько простых?  [new]
PavelRemm
Member

Откуда:
Сообщений: 3
vkle
Индексы правильно проставить необходимо в любом случае.


Про индексы можно подробнее? Я не совсем понимаю.
1 окт 17, 01:27    [20834040]     Ответить | Цитировать Сообщить модератору
 Re: 1 сложный запрос или несколько простых?  [new]
982183
Member

Откуда:
Сообщений: 916
PavelRemm
Можно ли это все сделать одним запросом?

........
Что будет лучше с точки зрения производительности, 3 таких запроса или 1 большой и страшный(если он возможен).
[/quot]
Приоритеты не так расставлены.
Для отладки используй три запроса. Можно будет посмотреть промежуточные данные.
После проверки работоспособности алгоритма - объедини в один.
Проверь оба варианта на скорость.
1 окт 17, 08:05    [20834097]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить