Получение хранимой процедуры mySQL приводит к другой хранимой процедуре - PullRequest
2 голосов
/ 29 декабря 2011

Мне нужен пример хранимой процедуры, которая использует результаты двух других хранимых процедур (или даже только одну), где результаты используются в качестве таблиц в объединенной хранимой процедуре. Я мог бы взять это оттуда.

примеры в Интернете (несколько сайтов) и подробности на php.net слишком просты.

Основную проблему можно увидеть здесь:

SELECT ttd.person_id, weight, min(test_date)
FROM (
  CALL get_team_member_body_stats(1) AS tbs,   
  CALL get_team_member_first_last_test_date(1) AS ttd
  WHERE tbs.person_id = ttd.person_id
  AND (tbs.test_date = ttd.first_test OR tbs.test_date = ttd.last_test)
  GROUP BY ttd.person_id;
END

Спасибо за любую помощь. Вчера и сегодня я несколько часов бился с этим в поисках и экспериментах в Интернете.

Детали:

Таблица 1

хранимая процедура get_team_member_body_stats (IN team_id INT) работает над 5 таблицами (person, team, person_team, body_stats, person_body_stats) и производит:

person_id | body_stats_id | weight | test_date |   
  2         2               200      2011-01-01  
  4         3               250      2011-01-01  
  1         5               145      2011-03-01 
  2         6               210.4    2011-03-01 
  5         7               290      2011-03-01 
  1         8               140      2011-04-01 
  1         9               135      2011-05-01 
  4         11              245      2011-05-01 

Таблица 2

хранимая процедура get_team_member_first_last_test_date (IN team_id INT) работает над теми же таблицами и выдает:

person_id | first_test | last_test

1           2011-03-01   2011-05-01
2           2011-01-01   2011-03-01
4           2011-01-01   2011-05-01
5           2011-03-01   2011-03-01

Цель - присоединиться к ним и произвести:

Таблица 3

person_id | first_weight | last_weight

1           145            135
2           200            210.4 
4           250            245
5           290            290

Спасибо

Ответы [ 2 ]

1 голос
/ 30 декабря 2011

Похоже (для этого сообщества и потому, что я не смог найти никаких примеров хранимых процедур, использующих наборы результатов из других хранимых процедур в качестве таблиц в новых таблицах выбора), что mysql либо не поддерживает это, либо что это нелепо сложноделать то, что я надеялся сделать.

Поэтому вместо вызова хранимых процедур я скопировал запросы в эту последнюю процедуру.


    DELIMITER $$

    CREATE DEFINER=`root`@`localhost` PROCEDURE `get_team_stats_change`(
        IN team_id INT
    )
    BEGIN
    SELECT SUM(start_weight) AS start_weight, 
        SUM(start_body_fat) AS start_body_fat, 
        SUM(current_weight) AS current_weight,
        SUM(current_body_fat) AS current_body_fat,
        SUM(weight_change) AS weight_change, 
        SUM(body_fat_change) AS body_fat_change FROM (
    SELECT ls.person_id, 
        fs.weight AS start_weight, fs.body_fat AS start_body_fat, 
        ls.weight AS current_weight, ls.body_fat AS current_body_fat,
        fs.weight - ls.weight AS weight_change, fs.body_fat - ls.body_fat AS body_fat_change
    FROM
    (SELECT ttd.person_id, bs.weight, bs.body_fat, bs.test_date
    FROM body_stats AS bs
    JOIN
        ((SELECT pbs.person_id,  min(bs.test_date)  AS first_test, max(bs.test_date) AS last_test   
        FROM body_stats AS bs,
            person_body_stats AS pbs,
            team_member AS tm,
            team AS t
        WHERE t.team_id = team_id
        AND tm.team_id = t.team_id
        AND tm.person_id = pbs.person_id
        AND pbs.body_stats_id = bs.body_stats_id
        AND tm.start_date  bs.test_date
        AND bs.test_date >= t.starting_date
        GROUP BY person_id) AS ttd,
        person_body_stats AS pbs)
    ON bs.test_date = ttd.first_test 
        AND pbs.person_id = ttd.person_id 
        AND pbs.body_stats_id = bs.body_stats_id) AS fs,

    (SELECT ttd.person_id, bs.weight, bs.body_fat, bs.test_date
    FROM body_stats AS bs
    JOIN
        ((SELECT pbs.person_id,  min(bs.test_date)  AS first_test, max(bs.test_date) AS last_test   
        FROM body_stats AS bs,
            person_body_stats AS pbs,
            team_member AS tm,
            team AS t
        WHERE t.team_id = team_id
        AND tm.team_id = t.team_id
        AND tm.person_id = pbs.person_id
        AND pbs.body_stats_id = bs.body_stats_id
        AND tm.start_date  bs.test_date
        AND bs.test_date >= t.starting_date
        GROUP BY person_id) AS ttd,
        person_body_stats AS pbs)
    ON bs.test_date = ttd.last_test 
        AND pbs.person_id = ttd.person_id 
        AND pbs.body_stats_id = bs.body_stats_id) AS ls
        WHERE ls.person_id = fs.person_id
       ) AS delta;
    END

0 голосов
/ 29 декабря 2011

Я не знаю, как легко вы можете получить эти результаты из 5 таблиц, включенных во временную таблицу или представление, но по сути, следующее должно сделать то же самое, что вы в настоящее время пытаетесь использовать для 3 хранимых процедур.

SELECT person_id
       , (SELECT weight 
          FROM   FiveTablesResult 
          WHERE  person_id = ftr.person_id 
                 AND test_date = (SELECT MIN(test_date) 
                                  FROM   FiveTablesResult 
                                  WHERE  person_id = ftr.person_id)
         ) AS first_weight
       , (SELECT weight 
          FROM   FiveTablesResult 
          WHERE  person_id = ftr.person_id 
                 AND test_date = (SELECT MAX(test_date) 
                                  FROM   FiveTablesResult 
                                  WHERE  person_id = ftr.person_id)
         ) AS last_weight
FROM   FiveTablesResult ftr

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...