У меня есть таблица "Пользователи" и таблица "Платежи". Мне нужен запрос, в котором перечислены пользователи, у которых есть запись в таблице платежей, где PaymentStatus = 1.
Он также должен указывать только пользователей с определенным идентификатором GroupID. ГруппаID будет передана переменной, но мы просто можем назвать ее 5 для простоты.
Временная метка записи (TimeCompleted) также должна быть меньше заданной временной метки, но мы можем просто назвать это 10.
Это столбцы в таблицах (упрощенные):
Users: UserID, GroupID, UserName
Payments: PaymentID, UserID, PaymentStatus, TimeCompleted
Запрос должен выбрать поле UserName.
Я задал аналогичный вопрос несколько часов назад, но я спросил его неправильно, и я не мог заставить запросы работать правильно для меня. Кроме того, если пользователь имеет более одного действительного и активного платежа, он должен возвращать только одно имя пользователя. Когда я пытался это сделать, я не мог этого сделать.
Вы можете улучшить свой текущий запрос, если хотите (он делает все, кроме последней проблемы с дублированием возвращаемых пользователей). Возможно, я ошибаюсь, но:
SELECT `Users`.`UserName`
FROM `Users`
LEFT OUTER JOIN `Payments` ON `Users`.`UserID` = `Payments`.`UserID`
WHERE `Payments`.`TimeCompleted` < 10
AND `Payments`.`PaymentStatus` = 1
AND `Users`.`GroupID` = 5
Вы хотите присоединиться к двум таблицам с помощью ключа UserId. Предложение group by ограничивает отдельное имя пользователя:
select UserName
from Users inner join Payments on (Users.UserID = Payments.UserID)
where PaymentStatus = 1 and GroupID = 5 and TimeCompleted < 10 group by Users.UserID;
select *
from users uu
join payments p on p.userid=uu.userid
where p.paymentcompleted=1 and uu.groupId=5
запрос будет выглядеть так: SELECT * FROM Users U.GroupId = 5 WHERE U.UserId IN (SELECT P.UserID FROM PAYMENTS P WHERE P.PaymentCompleted = 1 AND P.TimeStamp <= @DateVar)