Сложение строк из нескольких таблиц

Шех
Дата: 14.12.2012 02:58:43
Добрый день Уважаемы!
Я очень плохо понимаю MySQL поэтому нуждаюсь в вашей помощи.
У меня есть хранимая процедура (не уверен что она так называется)
+
CREATE DEFINER = 'dayz'@'localhost'
PROCEDURE dayz_chernarus.proc_PopulateSurvivorStats()
BEGIN
DROP TABLE IF EXISTS dayzstats.stats;
 CREATE TABLE dayzstats.stats
SELECT profile.name
     , (Profile.survival_attempts - 1) AS survival_attempts
     , profile.total_headshots
     , profile.total_survival_time
     , profile.total_bandit_kills
     , profile.total_survivor_kills
     , profile.total_zombie_kills
     , (profile.total_bandit_kills + profile.total_survivor_kills) AS Total_Kills
     , (profile.total_bandit_kills + profile.total_survivor_kills) / profile.survival_attempts AS KDR
     , (profile.survival_attempts) / (profile.total_survival_time / 60) AS SPH
     , ((profile.total_bandit_kills + profile.total_survivor_kills) / (profile.total_survival_time)) AS KPM
     , ((profile.total_bandit_kills + profile.total_survivor_kills) / (profile.total_survival_time / 60)) AS KPH
     , ((profile.total_bandit_kills + profile.total_survivor_kills) / ((profile.total_survival_time / 60) / 24)) AS KPD
     , (profile.total_headshots / profile.total_zombie_kills) AS ZHR

FROM
dayz_chernarus.survivor
INNER JOIN dayz_chernarus.profile
ON survivor.unique_id = profile.unique_id
WHERE
  1 = 1
GROUP BY
  profile.name;
END

Особо не знаю как описать требования но смог нарисовать схему как должна работать эта процедура :-)
+
Картинка с другого сайта.
Шех
Дата: 14.12.2012 03:00:39
Если кто нибудь может помочь, помогите пожалуйста
tanglir
Дата: 14.12.2012 05:15:30
Шех, пояснения к схеме давайте :) А лучше опишите словами, что хотите получить.
ЗЫ. Связь "профиль"-"выживший" - один к одному, или один ко многим (если да, то в какую сторону)?
Шех
Дата: 14.12.2012 07:34:07
вообщем требуется чтобы все выполнялось так же как щас, только в добавок чтобы к результатам он плюсовал значения из второй таблицы survivor как на рисунке показано.
смысл того что в первой таблице значения обновляются только после смерти персонажа, поэтому хотелось бы чтобы он плюсовал значения из второй таблицы персонажа который еще живой, т.к тамо хранятся все персонажи одного профиля нужно указать типо исключения, у живого персонажа в колонке is_dead = 0, мертвый персонаж как is_dead = 1, ну и чтобы он плюсовал правильную строку нужно чтобы из profile и survivor unique_id = unique_id.
надеюсь смог перенести задумку ^_^

P.S сильно не пинайте, плохо смыслю в программировании и mysql и тому подобное))
tanglir
Дата: 14.12.2012 07:55:57
Шех,

таблица profile: статистика по умершим персонажам
таблица survivor: данные о всех персонажах, в т.ч. и о текущем (живом)
таблицы связаны 1:M по unique_id

Сейчас в stats лежит информация, собранная только по "прошлым жизням" персонажей. А хочется видеть с учётом текущего ("живого") персонажа.

Я правильно вас понял?

тогда как-то так
SELECT profile.name
     , (Profile.survival_attempts - 1) AS survival_attempts
     , profile.total_headshots
     , profile.total_survival_time
     , profile.total_bandit_kills
     , profile.total_survivor_kills
     , profile.total_zombie_kills
     , (profile.total_bandit_kills + profile.total_survivor_kills 
 +s.survivor_kills+s.zombie_kills+s.bandit_kills ) AS Total_Kills
     , (profile.total_bandit_kills + profile.total_survivor_kills
+s.survivor_kills+s.zombie_kills+s.bandit_kills) / profile.survival_attempts AS KDR
     , (profile.survival_attempts) / ((profile.total_survival_time+s.survival_time) / 60) AS SPH --см.ниже
--ну и так далее
FROM
dayz_chernarus.survivor s
INNER JOIN dayz_chernarus.profile
ON s.unique_id = profile.unique_id
GROUP BY
  profile.name;
Правда, у вас в статистике профиля есть некоторые поля (к примеру, total_survival_time), у которых в таблице survivor не видно соответствия. Я написал в предположении, что соответствие в иде поля survivor.survival_time всё-таки есть, но если их нет, то как вы будете по ним рассчитывать статистику, я не знаю.
ЗЫ. Имя профиля - уникальное? Если нет, рискуете наступить на грабли, заботливо положенные разработчиками mysql под оператор group by :)
Шех
Дата: 14.12.2012 08:07:03
tanglir,

автор
Сейчас в stats лежит информация, собранная только по "прошлым жизням" персонажей. А хочется видеть с учётом текущего ("живого") персонажа.


Да правильно.

Строка total_survival_time только в профиле, в survivor ее нету.


P.S вот это мне вообще в принципе не надо...
, (profile.total_bandit_kills + profile.total_survivor_kills) / profile.survival_attempts AS KDR
     , (profile.survival_attempts) / (profile.total_survival_time / 60) AS SPH
     , ((profile.total_bandit_kills + profile.total_survivor_kills) / (profile.total_survival_time)) AS KPM
     , ((profile.total_bandit_kills + profile.total_survivor_kills) / (profile.total_survival_time / 60)) AS KPH
     , ((profile.total_bandit_kills + profile.total_survivor_kills) / ((profile.total_survival_time / 60) / 24)) AS KPD
     , (profile.total_headshots / profile.total_zombie_kills) AS ZHR
tanglir
Дата: 14.12.2012 08:12:31
Шех
P.S вот это мне вообще в принципе не надо...
Тогда у вас уже есть готовый запрос.
Шех
Дата: 14.12.2012 08:16:07
tanglir,

но он не показывает данные тех кто еще жив... они обновляются только после смерти...

что то подобное будет работать?
CREATE DEFINER = 'dayz'@'localhost'
PROCEDURE dayz_chernarus.proc_PopulateSurvivorStats()
BEGIN
DROP TABLE IF EXISTS dayzstats.stats;
CREATE TABLE dayzstats.stats
SELECT profile.name
     , (Profile.survival_attempts - 1) AS survival_attempts
     , (profile.total_headshots + s.headshots) AS total_headshots
     , profile.total_survival_time
     , (profile.total_bandit_kills + s.bandit_kills) AS total_bandit_kills
     , (profile.total_survivor_kills + s.survivor_kills) AS total_survivor_kills
     , (profile.total_zombie_kills + s.zombie_kills) AS total_zombie_kills
     , (profile.total_bandit_kills + profile.total_survivor_kills + s.survivor_kills + s.bandit_kills ) AS Total_Kills
FROM
dayz_chernarus.survivor s
INNER JOIN dayz_chernarus.profile
ON s.unique_id = profile.unique_id
GROUP BY
  profile.name;
Шех
Дата: 14.12.2012 08:19:37
и да имя профиля уникально... у каждого свой ник в игре...
tanglir
Дата: 14.12.2012 08:34:31
что-то с утра туплю
да и в процедуре (самой первой) какой-то бред написан
зачем джойнить survivor, если из неё ничего не берётся?
и как это я собирался суммировать без агрегатных функций?
в общем, забудьте всё, что я тут понаписал, вот нормальный запрос:
SELECT profile.name
     , (Profile.survival_attempts - 1) AS survival_attempts
     ,(profile.total_headshots + ifnull(s.headshots,0) AS total_headshots
     , profile.total_survival_time
     , profile.total_bandit_kills + ifnull(s.bandit_kills,0) AS total_bandit_kills
     , profile.total_survivor_kills + ifnull(s.survivor_kills,0) AS total_survivor_kills
     , profile.total_zombie_kills + ifnull(s.zombie_kills,0) AS total_zombie_kills
     , profile.total_bandit_kills + profile.total_survivor_kills + ifnull(s.survivor_kills + s.bandit_kills,0 ) AS Total_Kills
FROM
dayz_chernarus.profile
LEFT JOIN 
(select unique_id,bandit_kills,survivor_kills,zombie_kills,headshots
 from dayz_chernarus.survivor
 where is_dead=0
)
ON s.unique_id = profile.unique_id