Задать вопрос

Как оптимизировать такой sql запрос?

Народ, возможно ли оптимизировать этот запрос?

$sql = $this -> db -> pdo -> query("
(SELECT n.title as title,n.npc_id as id FROM npc as n, game as g WHERE g.id = n.npc_id AND g.type = 'npc' AND g.loc = '".$user['loc']."') 
UNION 
(SELECT u.login as title,u.user_id as id FROM `users` as `u`,`game` as `g` WHERE g.id = u.user_id AND g.type = 'user' AND g.loc = '".$user['loc']."' AND u.user_id != '".$user['user_id']."')
"smile -> fetchAll();


Мне нужно добавить к этому еще один union, но мне кажется, что довольно большую нагрузку может создать) Или быть может разделить запросы и потом соединить через array_merge?
  • Вопрос задан
  • 292 просмотра
Подписаться 1 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 4
Akdmeh
@Akdmeh
PHP, Yii2, Music
Нет, через array_merge хуже. Одно дело - один запрос но большой, или три разных запроса, но меньше.
То есть, во втором случае скрипт наоборот создаст еще больше нагрузки.
Хотя у вас есть определенные проблемы с архитектурой программы, если понадобился UNION.
Ответ написан
@dmitryKovalskiy
программист средней руки
Не кажется, а может и создаст. У вас два запроса с CROSS JOIN причем оба используют одну и туже таблицу.
первый запрос красивее был бы
SELECT * FROM NPC AS N
JOIN game AS g ON g.id = n.npc_id
WHERE g.type = 'npc' AND g.loc = '".$user['loc']."'

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

UPD:
select COALESCE(n.title,u.login) as title, COALESCE(n.npc_id, u.user_id) as id from game as g
LEFT JOIN npc as n ON g.id = n.id AND g.type = 'npc'
LEFT JOIN users as u ON g.id = u.id AND g.type = 'user'

Попробуй вот такой запрос на базе исполнить. Если будет корректно работать - можно будет заняться фильтрацией.
Ответ написан
k_e_m_e_l
@k_e_m_e_l Автор вопроса
В общем пишу небольшую онлайн игрушку)
Есть таблица npc (персонажи внитриигровые), также таблица users(пользователей), также же есть промежуточная таблица game(в ней хранятся локации, и id этих npc и пользователей, поля loc,id,type-юзер или npc)
Нужно вывести всех кто есть на локации
Ответ написан
Комментировать
@kPers
Ruby way like
я думаю что-то похожее на это должно быть:
SELECT u.login AS title
,u.user_id AS id
,n.title AS npc.title
,n.npc_id AS npc.id
FROM users AS u
INNER JOIN game AS g
ON u.id = u.user_id
INNER JOIN npc AS n
ON g.id = n.npc_id
AND g.type = 'npc'
WHERE g.type = 'user'
AND g.loc = '".$user['loc']."'
AND u.user_id!= '".$user['USER_ID']."'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы