SQL视图不能正常工作

时间:2017-06-11 16:14:50

标签: mysql sql

以下是我的观点陈述:

    CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `root`@`localhost` 
    SQL SECURITY DEFINER
VIEW `seeallcontent` AS
    SELECT 
        `members`.`MemberID` AS `Member ID`,
        `members`.`FirstName` AS `FirstName`,
        `members`.`LastName` AS `LastName`,
        `centreaddress`.`Location` AS `Location`,
        `memlevel`.`level` AS `Membership`
    FROM
        (((`centreaddress`
        LEFT JOIN `centre` ON ((`centre`.`CAddress` = `centreaddress`.`id`)))
        LEFT JOIN `members` ON ((`centre`.`memberID` = `members`.`MemberID`)))
        JOIN (`memlevel`
        LEFT JOIN `membership` ON ((`membership`.`membershipID` = `memlevel`.`ID`))))

并输出所有成员及其中心,然后重复成员类型,就像每个成员都拥有每个成员类型一样。我理解它这样做是因为我没有正确地将memlevel排序到membersID但是我不能让它输出中心和memlevel并将它们与成员进行比较。

如果我删除任何会员资格,那么我可以让它产生一个完美的会员及其中心名单。

这是我的数据库ERD的一个例子 (我知道你可以在大多数DBMS中自动生成它们,这只是一个截图,因为我必须为我的考试项目制作一个)。我试图把所有3个表中的一些放在一起。 enter image description here

2 个答案:

答案 0 :(得分:1)

首先删除所有这些括号。那看起来很可怕。像MS Access查询一样。然后你的外连接似乎没有意义。您选择中心地址并期望找到没有相关中心的条目?你为什么这样?我认为你最好再次阅读外部联接。

选择带有数据的成员似乎很自然:

CREATE VIEW seeallcontent AS
SELECT 
  m.memberid AS "Member ID",
  m.firstname AS "FirstName",
  m.lastname AS "LastName",
  ca.location AS "Location",
  ml.level AS "Membership"
FROM members m
JOIN membership ms ON ms.memberID = m.memberID
JOIN memlevel ml ON ml.id = ms.levelid
JOIN centre c ON c.memberID = m.memberID
JOIN centreaddress ca ON ca.id = c.caddress;

根据此查询考虑您是否需要其他内容。也许包括没有会员资格的会员? (这是否可能?他们会成为"成员"那么?)好吧,然后外部加入msml而不是内部加入他们。你想要没有中心的会员吗?然后是外部联接cca

当然,对于有三个会员资格和两个中心的会员,这会给你3 x 2 = 6行。它会将每个成员/级别与每个中心/地址相结合,但结果可能会如何呢?您必须将结果限制为,例如,一个中心/地址或一个成员资格/级别,以避免这种乘法。或者根本不写这个观点,如果结果不是你想要的结果。也许这最好是两个单独的视图。

答案 1 :(得分:0)

这是我根据Thorsten Kettner回答的最终代码:

  CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `root`@`localhost` 
    SQL SECURITY DEFINER
VIEW `seeallcontent` AS
    SELECT 
        `m`.`MemberID` AS `Member ID`,
        `m`.`FirstName` AS `FirstName`,
        `m`.`LastName` AS `LastName`,
        `ca`.`Location` AS `Location`,
        `ml`.`mlevel` AS `Membership`
    FROM
        ((((`members` `m`
        JOIN `membership` `ms` ON ((`ms`.`memberID` = `m`.`MemberID`)))
        JOIN `memlevel` `ml` ON ((`ml`.`ID` = `ms`.`mslevel`)))
        JOIN `centre` `c` ON ((`c`.`memberID` = `m`.`MemberID`)))
        JOIN `centreaddress` `ca` ON ((`ca`.`id` = `c`.`CAddress`)))

我必须将级别更改为mslevel和mlevel,因为级别是保留关键字,我也更改了它所定位的值,因为它获得了一半的结果。