Mysql 无法在4表查询中显示所有结果

Mysql 无法在4表查询中显示所有结果,mysql,sql,alias,Mysql,Sql,Alias,我有零件表和价格表 零件表本身与保修零件号相关 我想运行一个查询以显示所有零件,如果它们有保修,则显示保修的零件号,然后显示价格 select `P`.`partNumber` AS `partNumber`,`P`.`Description` AS `Description`,`PP`.`Price` AS `Price`,`P`.`WarrantyPartNumber` AS `WarrantyPartNumber`,`W`.`Description` AS `WDescription` f

我有零件表和价格表 零件表本身与保修零件号相关

我想运行一个查询以显示所有零件,如果它们有保修,则显示保修的零件号,然后显示价格

select `P`.`partNumber` AS `partNumber`,`P`.`Description` AS `Description`,`PP`.`Price` AS `Price`,`P`.`WarrantyPartNumber` AS `WarrantyPartNumber`,`W`.`Description` AS `WDescription`
from ((`tblPart` `P` left outer join `tblPart` `W` on `P`.`WarrantyPartNumber` = `W`.`partNumber`)  inner join `tblPartPrice` `PP` on `P`.`partNumber` = `PP`.`partNumber`) 
where PP.tierID = 0  
上面给出了正确的输出,但没有价格。一旦我添加保修价格表参考,我只会得到显示保修的零件

select `P`.`partNumber` AS `partNumber`,`P`.`Description` AS `Description`,`PP`.`Price` AS `Price`,`P`.`WarrantyPartNumber` AS `WarrantyPartNumber`,`W`.`Description` AS `WDescription`, `wPP`.`Price` AS `wPrice`  
from ((`tblPart` `P` left outer join `tblPart` `W` on `P`.`WarrantyPartNumber` = `W`.`partNumber`)  inner join `tblPartPrice` `PP` on `P`.`partNumber` = `PP`.`partNumber`) right outer join `tblPartPrice` `wPP` on `W`.`partNumber` = `wPP`.`partNumber`
where PP.tierID = 0 AND wPP.tierID = 0
预期结果

有或无保修的所有零件均显示任何保修的成本 元素(如果存在)


这是您的查询,修复为至少可读:

select p.partNumber, p.Description, pp.Price, 
       pp.WarrantyPartNumber,
       w.Description AS WDescription, wPP.Price AS wPrice
from tblPart p left outer join
     tblPart w
     on p.WarrantyPartNumber = w.partNumber inner join
     tblPartPrice pp
     on p.partNumber = pp.partNumber right outer join
     tblPartPrice wPP
     on w.partNumber = wPP.partNumber
where PP.tierID = 0 AND wPP.tierID = 0;
where
子句混合左连接和右连接是非常复杂的。您的查询似乎可以使用更简单的方法

如果我理解正确,保修零件的分层必须相同。因此,此条件应在on条款中:

select p.partNumber, p.Description, pp.Price, 
       pp.WarrantyPartNumber,
       w.Description AS WDescription, wPP.Price AS wPrice
from tblPart p join
     tblPartPrice pp
     on p.partNumber = pp.partNumber left outer join
     tblPart w
     on p.WarrantyPartNumber = w.partNumber left join
     tblPartPrice wpp
     on w.partNumber = wpp.partNumber and
        wpp.tierID = pp.TierId
where pp.tierID = 0;
注意
join
s:

  • p
    内部联接
    pp
    ,因为它们应该匹配。您希望每个部件都有一个价格
  • 左连接
    w
    ,因为可能没有保修零件
  • left join
    wpp
    ,因为以前的
    left join
    可能没有找到匹配的行

这是您的查询,至少修复为可读:

select p.partNumber, p.Description, pp.Price, 
       pp.WarrantyPartNumber,
       w.Description AS WDescription, wPP.Price AS wPrice
from tblPart p left outer join
     tblPart w
     on p.WarrantyPartNumber = w.partNumber inner join
     tblPartPrice pp
     on p.partNumber = pp.partNumber right outer join
     tblPartPrice wPP
     on w.partNumber = wPP.partNumber
where PP.tierID = 0 AND wPP.tierID = 0;
where
子句混合左连接和右连接是非常复杂的。您的查询似乎可以使用更简单的方法

如果我理解正确,保修零件的分层必须相同。因此,此条件应在on条款中:

select p.partNumber, p.Description, pp.Price, 
       pp.WarrantyPartNumber,
       w.Description AS WDescription, wPP.Price AS wPrice
from tblPart p join
     tblPartPrice pp
     on p.partNumber = pp.partNumber left outer join
     tblPart w
     on p.WarrantyPartNumber = w.partNumber left join
     tblPartPrice wpp
     on w.partNumber = wpp.partNumber and
        wpp.tierID = pp.TierId
where pp.tierID = 0;
注意
join
s:

  • p
    内部联接
    pp
    ,因为它们应该匹配。您希望每个部件都有一个价格
  • 左连接
    w
    ,因为可能没有保修零件
  • left join
    wpp
    ,因为以前的
    left join
    可能没有找到匹配的行

tblPart中的所有零件都有tblPart价格吗?是的,在大多数情况下,它有4个价格,因为我有分层定价。“显示任何保修要素的成本”-这是否意味着每个零件可以有许多保修项目?表:tblPart列类型注释零件号varchar(50)Shorttitle varchar(255)说明varchar(255)类别ID int(11)保修零件号varchar(50)tblpartPrice列类型注释零件号varchar(50)TierID浮动价格浮动没有一个项目可以选择单个12个月保修。但其他更便宜的项目不会tblPart中的所有零件都有tblPart价格吗?是的,在大多数情况下,它有4个价格,因为我有分层定价。“显示任何保修要素的成本”-这是否意味着每个零件可以有多个保修项目?表:tblPart列类型注释零件号varchar(50)Shorttitle varchar(255)Description varchar(255)CategoryID int(11)保修零件号varchar(50)tblpartPrice列类型注释零件号varchar(50)TierID浮动价格浮动没有一个项目可以选择单次12个月保修。但是其他更便宜的东西就不管用了,谢谢。必须稍微调整:选择p.零件号、p.说明、p.价格、p.保修零件号、w.说明作为WDDescription,wpp.Price作为wPrice从tblPart p加入tblPartPrice pp on p.partNumber=pp.partNumber左外加入tblPart w on p.WarrantyPartNumber=w.partNumber左加入tblPartPrice wpp.partNumber=wpp.partNumber和wpp.tierID=pp.tierID,其中pp.tierID=0但您为我节省了很多时间,谢谢谢谢你,真是太好了,谢谢。必须稍微调整:选择p.零件号、p.说明、p.价格、p.保修零件号、w.说明作为WDDescription,wpp.Price作为wPrice从tblPart p加入tblPartPrice pp on p.partNumber=pp.partNumber左外加入tblPart w on p.WarrantyPartNumber=w.partNumber左加入tblPartPrice wpp.partNumber=wpp.partNumber和wpp.tierID=pp.tierID,其中pp.tierID=0但您为我节省了很多时间,谢谢。