[英]SQL Help Inner JOIN LEFT JOIN
My query is: 我的查询是:
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
And results are: 结果是:
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
Now I want to do another query which would be: If Rate.ProfileID = 32, remove any rows that contain that same Pics.ID 现在,我要执行另一个查询,即:如果Rate.ProfileID = 32,则删除任何包含相同Pics.ID的行。
so left with: 所以留下:
ID ProfileID Position RateID Rating ProfileID Gender
23 24 1 59 9 42 female
23 24 1 53 3 40 female
and also remove any duplicate Pics.ID so just one of the above as they are both = 23 so left with : 并删除所有重复的Pics.ID,因此它们都是23,因此只保留了上述之一:
23 24 1 59 9 42 female or 23 24 1 53 3 40 female 23 24 1 59 9 42母头或23 24 1 53 3 40母头
You should probably get rid of "magical numbers", like 32. That said, I think that this will give you what you need. 您可能应该摆脱“神奇数字”,例如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 Because the 2nd row contains the Rate.ProfileID = 32, and that Pic.ID = 24, therefore it must remove ALL Pic.ID = 24, which removes the bottom row also. @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
Try this: 尝试这个:
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
The last LEFT JOIN
operation helps identify duplicates using this predicate in the ON
clause: 最后一个LEFT JOIN
操作使用ON
子句中的此谓词帮助识别重复项:
Rate.ProfileID = r.ProfileID
If such duplicates exist, as is the case with Rate.ProfileID = 42
, then only the one having the maximum Rate.ID
is returned due to the following conditions: 如果存在此类重复项(如Rate.ProfileID = 42
的情况),则由于以下条件,仅返回具有最大 Rate.ID
:
Rate.ID > r.ID (`ON` clause)
and 和
(r.ID IS NULL) (`WHERE` clause)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.