需要一些复杂的JOIN辅助是SQL Query

时间:2013-08-02 09:27:39

标签: mysql sql join

看看这些表

enter image description here

这很简单:Venue包含 country_ID ,这是Society_Territory中的FK,我们会在其中找到 society_ID ,这是{{FK} { 1}}。我在查询过程中有一个Venue_ID,我的 目标 是为了获得 Society_Name ,但是有一个扭曲,但首先让我们得到 Society_Name

在以下查询中仅查看 JOINS ,在那里我将使用此Society前缀

添加评论
//

直到这里一切都很酷。现在这里是 TWIST

SELECT uuid()AS `UUID`, `pc`.`PRSClaimID` AS `prsclaimid`, `a`.`LoginName` AS `loginname`, `a`.`BandName` AS `bandname`, `smartistdetails`.`LoginName` AS `createdbyloginname`, `Society`.`Society_Name` AS societyName count( `smliveclaims`.`LiveclaimsID` )AS `gigcount` FROM `smprsliveclaimlink` JOIN `smliveclaims` ON `smprsliveclaimlink`.`fkLiveClaimID` = `smliveclaims`.`LiveclaimsID` // Here I have the Venue_ID from smliveclaims so i starting moving towards society name JOIN Venue ON `smliveclaims`.fk_venueId = Venue.Venue_ID JOIN Society_Territory ON Venue.Country_ID = Society_Territory.Country_ID JOIN Society ON Society_Territory.Society_Id = Society.Society_ID // Now from Society i can select the Society_Name which i am already doing in the query above JOIN `smartistdetails` `a` JOIN `smprsclaims` `pc` ON `a`.`ArtistID` = `pc`.`fkArtistID` JOIN `smcategories` ON `pc`.`FK_CategoryID` = `smcategories`.`Id` JOIN `smcategoriestype` ON `smcategories`.`fk_CategoryTypeId` = `smcategoriestype`.`Id` JOIN `smartistdetails` ON `pc`.`CreatedBy` = `smartistdetails`.`ArtistID` AND `smprsliveclaimlink`.`fkPRSClaimID` = `pc`.`PRSClaimID` GROUP BY `a`.`LoginName`, `a`.`BandName`, `smcategories`.`Id`, `smcategoriestype`.`CategoryType`, `smartistdetails`.`LoginName` 中的Country_ID Venue将不在Society_Territory中。我仍然想要选择它们,而不是显示和实际Society_Name想要显示诸如“其他”这样的词

2 个答案:

答案 0 :(得分:2)

当您将SOCIETY_TERRITORY与SOCIETY

链接时,

将VENUE与SOCIETY_TERRITORY链接时使用LEFT OUTER JOIN

注意:使用LEFT OUTER JOIN时,所有依赖于它的表必须与其他LEFT OUTER JOIN链接,因为如果使用INNER JOIN,则取消对LEFT的di效果。

编辑:

SELECT
    uuid()AS `UUID`,
    `pc`.`PRSClaimID` AS `prsclaimid`,      
    `a`.`LoginName` AS `loginname`,
    `a`.`BandName` AS `bandname`,
    `smartistdetails`.`LoginName` AS `createdbyloginname`,          
    coalesce(`Society`.`Society_Name`, 'Other') AS societyName
    count(`smliveclaims`.`LiveclaimsID`)AS `gigcount`    
FROM `smprsliveclaimlink`
JOIN `smliveclaims`
    ON `smprsliveclaimlink`.`fkLiveClaimID` = `smliveclaims`.`LiveclaimsID`
// Here I have the Venue_ID from smliveclaims so i starting moving towards society name
JOIN Venue ON `smliveclaims`.fk_venueId = Venue.Venue_ID
LEFT OUTER JOIN Society_Territory ON Venue.Country_ID = Society_Territory.Country_ID
LEFT OUTER JOIN Society ON Society_Territory.Society_Id = Society.Society_ID    
// Now from Society i can select the Society_Name which i am already doing in the query above
JOIN `smartistdetails` `a`
JOIN `smprsclaims` `pc` ON `a`.`ArtistID` = `pc`.`fkArtistID`
JOIN `smcategories` ON `pc`.`FK_CategoryID` = `smcategories`.`Id`
JOIN `smcategoriestype` ON  `smcategories`.`fk_CategoryTypeId` = `smcategoriestype`.`Id`
JOIN `smartistdetails` ON `pc`.`CreatedBy` = `smartistdetails`.`ArtistID` AND `smprsliveclaimlink`.`fkPRSClaimID` = `pc`.`PRSClaimID`
GROUP BY
    `a`.`LoginName`,
    `a`.`BandName`,
    `smcategories`.`Id`,
    `smcategoriestype`.`CategoryType`,
    `smartistdetails`.`LoginName`

答案 1 :(得分:0)

您的所有JOIN都是INNER JOIN个。 INNER关键字在MySQL中是可选的,经常被省略(如示例所示)。在需要的地方使用LEFT OUTER JOIN并修改您的SELECT子句以包含类似“COALESCE(Society_Name,'Other')Society_Name”的内容