2016-10-18 4 views
0

画像に表示されているテーブルのデータと最大の日付を組み合わせたビューを作成したいとします。これらは、profileIDでグループ化する必要があります。日付が最大のすべてのデータを含むMySQL Creatビュー

Database ERM

は、profileIDがprofile.userIDにリンクされています。

私は自分のコードで異なるアトラクションを試しました。要塞1は日付が最大のデータを選択しますが、結合は機能しません。すべてのprofileIDは同じデータで結合されます。

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

閲覧fitchallengersql1。二一

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 

AS profileview参加作品どのようにする必要がありますが、私は日付が最大であるデータだけを選択する方法を把握することはできません。

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

+1

は、サンプルデータと期待出力[**どのようツー掲載し**](http://stackoverflow.com/help/how-to-ask) \t \tを読み、ここでください私たちを表示します方法を学ぶには[** START **](http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)に最適な場所です質問の質を向上させ、より良い回答を得ることができます。 –

答えて

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 
+0

ありがとう! これは私のために働くだろう。唯一の問題は、MySQLがビューのFrom部分にサブクエリを受け入れないことです。 複数のビューを使用して作業しましたが、この問題の解決策を見つけなければならないと思います。 – Fleewe

0

これはコメントですが、私は整形機能を必要:

代わりに、関連する述語が続くONを使用し、ANSI結合構文を使用している場合、where句に参加する述語を置かないでください。例えば

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` 
+0

ありがとうございます! 私はこのように自分の意見を調整しました。 – Fleewe

関連する問題