是否可以将此查询转换为连接?

时间:2012-06-01 12:29:46

标签: mysql

这是查询:

SELECT *
FROM square_achievements_achievements
JOIN square_achievements_achievement_counters ON square_achievements_achievement_counters.SAA_ID = square_achievements_achievements.SAA_ID
JOIN square_achievements_counters ON square_achievements_counters.SAC_ID = square_achievements_achievement_counters.SAC_ID
WHERE square_achievements_counters.eventObject = 'CommentEvent'
AND square_achievements_counters.eventType = 'add'
AND square_achievements_achievements.SAA_ID NOT IN
(
    SELECT square_achievements_achievements.SAA_ID 
    FROM square_achievements_achievements 
    JOIN square_achievements_user_achievements ON square_achievements_user_achievements.SAA_ID = square_achievements_achievements.SAA_ID
    WHERE square_achievements_user_achievements.UID = 83
)

如果可能,将此查询编写为连接会更有效吗?如果是这样,它将如何被重写?

2 个答案:

答案 0 :(得分:1)

SELECT  a.*
FROM    achievements a
JOIN    achievement_counters ac
ON      ac.saac_id = a.saa_id
JOIN    counters c
ON      c.sac_id = ac.sac_id
WHERE   c.eventObject = 'CommentEvent'
        AND c.eventType = 'add'
        AND a.saa_id NOT IN
        (
        SELECT  saa_id
        FROM    user_achievements 
        WHERE   uid = 83
        )

这很不错。

如果你想加入,请使用:

SELECT  a.*
FROM    achievements a
JOIN    achievement_counters ac
ON      ac.saac_id = a.saa_id
JOIN    counters c
ON      c.sac_id = ac.sac_id
LEFT JOIN
        user_achievements ua
ON      ua.uid = 83
        AND ua.saa_id = a.saa_id
WHERE   c.eventObject = 'CommentEvent'
        AND c.eventType = 'add'
        AND ua.saa_id IS NULL

答案 1 :(得分:0)

我更喜欢使用相关名来提高代码的可读性

试试这个:

SELECT * 
FROM square_achievements_achievements a
JOIN square_achievements_achievement_counters b  ON b.SAAC_ID = a.SAA_ID 
JOIN square_achievements_counters c ON c.SAC_ID = b.SAC_ID 
JOIN square_achievements_user_achievements d on d.SAA_ID = a.SAA_ID 
JOIN square_achievements_user_achievements u on d.SAA_ID = u.SAA_ID AND u.UID = 83 
WHERE c.eventObject = 'CommentEvent' 
AND a.eventType = 'add'