SQL Выберите каждую строку в table1, которая имеет строку в table2 - PullRequest
0 голосов
/ 12 октября 2011

У меня есть две таблицы: одна для пользователей и одна для продлений. Я хочу выбрать всех пользователей, у которых есть строка в таблице обновлений для определенного года, и я могу сделать это нормально. Однако, если в таблице обновлений есть несколько строк для конкретного пользователя для конкретного года, я получаю дубликаты, которые мне не нужны.

Полагаю, это потому, что я до сих пор не совсем понимаю 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 ]

3 голосов
/ 12 октября 2011

Вы можете сделать это с JOINS, но мне нравится делать такие вещи с EXISTS и подзапросами, потому что это больше похоже на правило, которое я пытаюсь применить.Мне не нравится использовать RIGHT JOIN, если мне не нужно.Если вы можете, просто пользователь INNER JOIN.Если нет, переставьте FROM, чтобы вы могли использовать LEFT JOIN.Опять же, это просто для удобства чтения, но я не знаю, когда-либо использовал RIGHT JOIN.

1 голос
/ 12 октября 2011
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 '-%' 

Это сделает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...