SQL选择table1中table2中有一行的每一行

时间:2011-10-12 12:44:10

标签: sql join

我有两个表,一个用于用户,另一个用于续订。我想选择在续订表中有一行特定年份的所有用户,我可以做得很好。但是,如果续订表中特定年份的特定用户有多行,我会得到重复项,这是我不想要的。

我认为这是因为我仍然不太了解JOINS,所以这是我的查询:

SELECT * FROM `users` AS US 
    RIGHT JOIN `usermeta` UM1 
        ON UM1.`user_id` = US.`ID` 
    RIGHT JOIN `membership_renewals` MR 
        ON MR.`user` = US.`ID` AND MR.year = '2011' 
    WHERE 
        UM1.meta_key = 'member'
            AND UM1.meta_value = 1 
            AND US.`user_pass` NOT LIKE '-%'

2 个答案:

答案 0 :(得分:3)

你可以用JOINS来做,但我喜欢用EXISTS和子查询来做这件事,因为它更像是我试图强制执行的规则。

SELECT * FROM `users` AS US 
    RIGHT JOIN `usermeta` UM1 
        ON UM1.`user_id` = US.`ID` 
    WHERE 
        Exists (Select 1 FROM `membership_renewals` MR 
                WHERE MR.`user` = US.`ID` 
                AND MR.year = '2011') 
        AND UM1.meta_key = 'member'
        AND UM1.meta_value = 1
        AND US.`user_pass` NOT LIKE '-%'

P.S。我真的不喜欢使用RIGHT JOIN,除非我必须这样做。如果可以,只需用户INNER JOIN。如果没有,重新排列FROM,以便您可以使用LEFT JOIN。同样,这只是为了可读性,但我不知道我曾经使用过RIGHT JOIN。

答案 1 :(得分:1)

SELECT * 
FROM `users` AS US      
RIGHT JOIN `usermeta` UM1          
ON UM1.`user_id` = US.`ID`      
RIGHT JOIN (select distinct mr.user from `membership_renewals` MR where MR.year = '2011') vt on vt.user = us.id
WHERE          UM1.meta_key = 'member'             
AND UM1.meta_value = 1              
AND US.`user_pass` NOT LIKE '-%' 

这样做。