繁体   English   中英

SQL帮助内连接左连接

[英]SQL Help Inner JOIN LEFT JOIN

我的查询是:

SELECT Pics.ID, Pics.ProfileID, Pics.Position, Rate.ID as RateID, Rate.Rating, Rate.ProfileID, Gender
FROM Pics
    INNER JOIN Profiles ON Pics.ProfileID = Profiles.ID
    LEFT JOIN Rate ON Pics.ID = Rate.PicID
WHERE Gender = 'female'
ORDER BY Pics.ID

结果是:

ID ProfileID Position RateID Rating ProfileID Gender
23 24        1        59     9      42        female
24 24        2        33     8      32        female
23 24        1        53     3      40        female
26 24        4        31     8      32        female
30 25        4        30     8      32        female
24 24        2        58     4      42        female

现在,我要执行另一个查询,即:如果Rate.ProfileID = 32,则删除任何包含相同Pics.ID的行。

所以留下:

ID ProfileID Position RateID Rating ProfileID Gender
23 24        1        59     9      42        female
23 24        1        53     3      40        female

并删除所有重复的Pics.ID,因此它们都是23,因此只保留了上述之一:

23 24 1 59 9 42母头或23 24 1 53 3 40母头

您可能应该摆脱“神奇数字”,例如32。也就是说,我认为这将为您提供所需的东西。

SELECT
    P.ID,
    P.ProfileID,
    P.Position,
    R.ID as RateID,
    R.Rating,
    R.ProfileID,
    PR.Gender
FROM
    Pics P
INNER JOIN Profiles PR ON PR.ID = P.ProfileID
LEFT JOIN Rate R ON R.PicID = P.ID
WHERE
    PR.Gender = 'female' AND
    NOT EXISTS (
        SELECT *
        FROM Pics P2
        INNER JOIN Profiles PR2 ON PR2.ID = P2.ProfileID
        INNER JOIN Rate R2 ON R2.PicID = P2.ID AND R2.ProfileID = 32
        WHERE
            P2.ID = P.ID
    )
ORDER BY
    P.ID

@Shadow因为第二行包含Rate.ProfileID = 32,并且该Pic.ID = 24,所以它必须删除所有Pic.ID = 24,这也删除了底行。

SELECT Pics.ID, Pics.ProfileID, Pics.Position, Rate.ID as RateID, Rate.Rating, Rate.ProfileID, Gender
FROM Pics
INNER JOIN Profiles ON Pics.ProfileID = Profiles.ID
LEFT JOIN Rate ON Pics.ID = Rate.PicID
WHERE Gender = 'female' AND Pics.ID NOT IN (
    SELECT Pics.ID 
    FROM Pics
    INNER JOIN Profiles ON Pics.ProfileID = Profiles.ID
    LEFT JOIN Rate ON Pics.ID = Rate.PicID
    WHERE Gender = 'female' AND Rate.ProfileID = 32)

ORDER BY Pics.ID

尝试这个:

SELECT Pics.ID, Pics.ProfileID, Pics.Position, Rate.ID as RateID, 
       Rate.Rating, Rate.ProfileID, Gender
FROM Pics
INNER JOIN Profiles ON Pics.ProfileID = Profiles.ID
LEFT JOIN Rate ON Pics.ID = Rate.PicID
LEFT JOIN Rate AS r 
   ON Rate.ProfileID = r.ProfileID AND Rate.ID > r.ID
WHERE Gender = 'female' AND (Pics.ProfileID <> 32) AND (r.ID IS NULL)
ORDER BY Pics.ID

最后一个LEFT JOIN操作使用ON子句中的此谓词帮助识别重复项:

Rate.ProfileID = r.ProfileID

如果存在此类重复项(如Rate.ProfileID = 42的情况),则由于以下条件,仅返回具有最大 Rate.ID

Rate.ID > r.ID (`ON` clause)

(r.ID IS NULL) (`WHERE` clause)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM