Help! Не могу составить из 3х сложных запросов 1

Lord Max

Guest
Help! Не могу составить из 3х сложных запросов 1

Задача: необходимо выбрать сумму всех значений определённого типа (пока всего 2), но выбрать нужно из разных таблиц, реально у меня работает только вариант с 3мя запросами, так как во всех таблицах я выбираю по разным критериям… совсем замучался, при такой выборке как показано ниже, я могу лишь циклом потом пробежать да просуммировать, но вариант не катит, поскольку слишком уж громоздкий для такой элементарной процедуры, уверен, что существуют другие варианты решения проблемы.
Пытался сделать 1м селектом, но выбираются только значения с одинаковыми stats_id, может быть UNION может помочь или что можно подправить здесь?

Есть 3 селекта:

--------#1
SELECT stats_id AS SID,stats_value AS IB
FROM users_stats
WHERE user_id=$id AND stats_id BETWEEN 2 AND 3
ORDER BY SID
--------#2
SELECT ib.stats_id AS SID,SUM(ib.bonus_value) AS IB
FROM i_lib_bonuses AS ib

JOIN slots AS s ON s.user_id=$id
JOIN items AS i ON i.item_id=s.item_id

WHERE ib.lib_id=i.lib_id AND s.item_id IS NOT NULL AND ib.stats_id BETWEEN 2 AND 3
GROUP BY SID
HAVING min(s.slot_id) > 10
ORDER BY SID

--------#3
SELECT iub.stats_id AS SID,SUM(iub.bonus_value) AS IB
FROM items_unique_bonuses AS iub

JOIN slots AS s ON s.user_id=$id

WHERE iub.item_id=s.item_id AND s.item_id IS NOT NULL AND iub.stats_id BETWEEN 2 AND 3
GROUP BY SID
HAVING min(s.slot_id) > 10
ORDER BY SID
 

chira

Новичок
Какая версия MySQL?
для чего первый запрос?

#2 по какому условию у тебя связываются таблицы ib & s?
#3 по какому условию у тебя связываются таблицы iub & s?
 

Lord Max

Guest
chira
4.0.18
- Первый запрос выдирает личные (постоянные) stats_value
- Второй запрос выдирает bonus_value (тоже что и stats_value), в зависимости от того какие i.item_id находятся в s.item_id при s.slot_id > 10
- Третий запрос делает тоже самое, но смотрит в таблицу уникальных bonus_value для тех же самых i.item_id

№2
В s находятся строки с i.item_id, а в i -> [lib_id] то есть связь через него, схема : ib.lib_id -> i.lib_id -> i.item_id -> s.item_id
№3
Аналогично, для тех же i.item_id , НО в таблице iub (уникальных бонусов) хранятся id предметов, а не id их библиотечных шаблонов, схема : iub.item_id -> i.item_id -> s.item_id
---------------
Запросы эти для того, чтобы высчитать максимальное здоровье исходя их 2х параметров выносливость и здоровье (BETWEEN 2 AND 3), сумму этих значений я и пытаюсь получить, но 3 запроса + 3 цикла ….. слишком долго. А параметры эти зависят от личных статов (запрос 1) от бонуса к статам всех «одетых» предметов в s (при s.slot_id > 10 всё, что от 1 до 10 – не одетые) (запрос 2) и от уникальных бонусов тех же предметов. (запрос 3)
Ps максимально здоровье = выносливость *5 + здоровье * 25 (поэтому не могу суммировать всё, нужно 2 поля)

-~{}~ 16.12.05 12:47:

хммм, chira так и чего мне предпринять ? всё находится в стадии разработки, могу и базу перекроить если потребуется.
И что, больше никто соображениями не поделится ? Не скажет читать мануал ? Не ткнёт носом, где я не прав ? Очень нуждаюсь в Вашем совете...
 

chira

Новичок
примерно так:
Код:
SELECT a.sid, SUM(a.ib) ib
FROM (
(SELECT stats_id AS SID,stats_value AS IB
FROM users_stats
WHERE user_id=$id AND stats_id BETWEEN 2 AND 3)
UNION ALL
(SELECT ib.stats_id AS SID,SUM(ib.bonus_value) AS IB
FROM i_lib_bonuses AS ib
JOIN slots AS s ON s.user_id=$id
JOIN items AS i ON i.item_id=s.item_id
WHERE ib.lib_id=i.lib_id AND s.item_id IS NOT NULL AND ib.stats_id BETWEEN 2 AND 3
GROUP BY SID
HAVING min(s.slot_id) > 10)
UNION ALL
(SELECT iub.stats_id AS SID,SUM(iub.bonus_value) AS IB
FROM items_unique_bonuses AS iub
JOIN slots AS s ON s.user_id=$id
WHERE iub.item_id=s.item_id AND s.item_id IS NOT NULL AND iub.stats_id BETWEEN 2 AND 3
GROUP BY SID
HAVING min(s.slot_id) > 10)
) a
GROUP BY SID
ORDER BY SID
здесь я просто скопировал твои запросы
обрати внимание на условия связывания для
#2 по какому условию у тебя связываются таблицы ib & s?
#3 по какому условию у тебя связываются таблицы iub & s?
отсутствие этих условий в запросах - это спесиально?
 

Lord Max

Guest
я же писал выше, ib.lib_id -> i.lib_id -> i.item_id -> s.item_id - вот и вся связь.
тоесть с помошью вложеных запросов можно сделать, а намного быстрее ли работает ? у меня-то не в количестве запросов проблема , а в скорости
 

chira

Новичок
Lord Max

если добавить условия в запросы, быстей не будет?
 

Lord Max

Guest
так у меняж в джойнах+WHERE ВСЕ условия стоят
 

chira

Новичок
Lord Max

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