MySQL Creat View包含日期最大的所有数据

时间:2016-10-18 20:53:15

标签: mysql database select join max

我想创建一个视图,它将数据与图片中显示的表中的最大日期相结合。这些应按profileID分组。

Database ERM

profileID链接到profile.userID。

我在代码中尝试了不同的方法。堡垒1将数据存入日期最大值,但连接不起作用。每个profileID都将使用相同的数据连接。

CREATE 
ALGORITHM = UNDEFINED 
DEFINER = `b91788dd8d05b5`@`%` 
SQL SECURITY DEFINER

查看fitchallengersql1profileview AS

Select p.userID,
(SELECT 
            `bf`.`bodyFat`
        FROM
            (`fitchallengersql1`.`bodyfatprofile` `bf`
            JOIN `fitchallengersql1`.`profile` `p`)
        WHERE
            ((`bf`.`profileID` = `p`.`userID`)
                AND (`bf`.`date` = (SELECT 
                    MAX(`fitchallengersql1`.`bodyfatprofile`.`date`)
                FROM
                    `fitchallengersql1`.`bodyfatprofile`)))) AS `bodyFat`,
    (SELECT 
            `bw`.`bodyweight`
        FROM
            (`fitchallengersql1`.`bodyweightprofile` `bw`
            JOIN `fitchallengersql1`.`profile` `p`)
        WHERE
            ((`bw`.`profileID` = `p`.`userID`)
                AND (`bw`.`date` = (SELECT 
                    MAX(`fitchallengersql1`.`bodyweightprofile`.`date`)
                FROM
                    `fitchallengersql1`.`bodyweightprofile`)))) AS `bodyWeight`,
    (SELECT 
            `bmi`.`bmi`
        FROM
            (`fitchallengersql1`.`bmiprofile` `bmi`
            JOIN `fitchallengersql1`.`profile` `p`)
        WHERE
            ((`bmi`.`profileID` = `p`.`userID`)
                AND (`bmi`.`date` = (SELECT 
                    MAX(`fitchallengersql1`.`bmiprofile`.`date`)
                FROM
                    `fitchallengersql1`.`bmiprofile`)))) AS `bmi`

        From profile

在第二个中,联接应该如何应用,但我无法找到一种方法来选择日期最大的数据。

    CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `b91788dd8d05b5`@`%` 
    SQL SECURITY DEFINER
VIEW `fitchallengersql1`.`profileview` AS
    SELECT 
        `p`.`userID` AS `userID`,
        `p`.`privacy` AS `privacy`,
        `bs`.`size` AS `bodysize`,
        `bw`.`bodyweight` AS `bodyweight`,
        `bf`.`bodyFat` AS `bodyfat`,
        `bmi`.`bmi` AS `bmi`
    FROM
        ((((`fitchallengersql1`.`profile` `p`
        JOIN `fitchallengersql1`.`bodysizeprofile` `bs`)
        JOIN `fitchallengersql1`.`bodyweightprofile` `bw`)
        JOIN `fitchallengersql1`.`bmiprofile` `bmi`)
        JOIN `fitchallengersql1`.`bodyfatprofile` `bf`)
    WHERE
        ((`p`.`userID` = `bs`.`profileID`)
            AND (`p`.`userID` = `bw`.`profileID`)
            AND (`p`.`userID` = `bmi`.`profileID`)
            AND (`p`.`userID` = `bf`.`profileID`))

希望有人可以帮助我。

谢谢!

fleewe

2 个答案:

答案 0 :(得分:0)

这只是一个评论,但我需要格式化功能:

如果使用ANSI连接语法,请不要将连接谓词放入where子句,而是使用ON后跟相关谓词。 e.g。

  FROM `fitchallengersql1`.`profile` `p`
        JOIN `fitchallengersql1`.`bodysizeprofile` `bs`   ON `p`.`userID` = `bs`.`profileID`
        JOIN `fitchallengersql1`.`bodyweightprofile` `bw` ON `p`.`userID` = `bw`.`profileID`
        JOIN `fitchallengersql1`.`bmiprofile` `bmi`       ON `p`.`userID` = `bmi`.`profileID`
        JOIN `fitchallengersql1`.`bodyfatprofile` `bf`    ON `p`.`userID` = `bf`.`profileID`

答案 1 :(得分:0)

希望以下查询能够满足您的需求。请遵循该模式并加入其余表格。请注意,当表格增长时,这些肯定会出现性能问题,因为这需要大量处理。

-- Select the columns that you need
select p.*, lbp.*
from profile p
inner join (
        -- get the latest bmiprofile per user profile
        select bp1.*
        from bmiprofile bp1
        inner join (select profileID, max(date) as date from bmiprofile group by profileID) as bp2 on bp1.prfileId = bp2.profileId and bp1.date = bp2.date

    ) as lbp on lbp.ProfileId = p.userId
-- Join the other tables in similar way