Как объединить 2 таблицы, получив все строки из левой таблицы и только совпадающие строки в правой
Таблица 1
Таблица 2
Таблица2.plan_selected показывает, какой план выбрал пользователь.
Например: Пользователь с user_id=4 в Table2 выбирает план id=2 из Table1.
Я хочу получить все строки из таблицы Table1 и только совпадающие строки из таблицы Table2 для определенного user_id
.
Ожидаемый результат выглядит следующим образом.
Я хочу получить все строки из Table1 и только выбранный план из Table2 для конкретного идентификатора пользователя, допустим 4.
Ожидаемый результат будет таким:
id name plantype plandetails requestpermonth price isdeleted planselected
1 ИСПОЛНИТЕЛЬНЫЙ ЕЖЕМЕСЯЧНО {1000 МОЖЕТ ПОТРЕБОВАТЬСЯ} 1000 50 0 NULL
2 БАЗОВЫХ ЕЖЕМЕСЯЧНЫХ {500 МОЖЕТ ПОТРЕБОВАТЬСЯ} 1000 25 0 2
3 БЕСПЛАТНЫХ МЕСЯЦА {10 МОЖЕТ ПОТРЕБОВАТЬСЯ} 1000 0 0 0 NULL
4 ИСПОЛНИТЕЛЬНЫЙ ГОДОВОЙ {1000 МОЖЕТ ПОТРЕБОВАТЬСЯ} 1000 500 0 NULL
5 БАЗОВЫЙ ГОДОВОЙ {500 МОЖЕТ ПОТРЕБОВАТЬСЯ} 1000 250 0 NULL
6 FREEEE YEARLY {10 MAY REQUSTS} 1000 0 0 NULL
Что я пытался сделать, так это использовать простое левое объединение.
select plans.id, name, plan_details, plan_type, request_per_month, price,is_deleted, plan_selected from SubscriptionsPlans as plans left join SubscriptionsOrder as orders on plans.id=orders.plan_selected where orders.user_id = 4
Вот мои 2 модели. ORM queryset или SQL запрос помогут
class SubscriptionsPlans(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=255)
plan_type = models.CharField(max_length=255)
plan_details = models.TextField(max_length=1000)
request_per_month = models.IntegerField()
price = models.FloatField()
is_deleted = models.BooleanField(default=False)
class SubscriptionsOrder(models.Model):
id = models.IntegerField(primary_key=True)
user_id = models.ForeignKey(
AppUser,
null=True,
on_delete=models.SET_NULL
)
plan_selected = models.ForeignKey(SubscriptionsPlans, null=True, on_delete=models.SET_NULL)
billing_info = models.IntegerField()
Вы можете сделать запрос с помощью:
SubscriptionsPlans.objects.filter(subscriptionsorder__user_id=4)
Здесь будут перечислены все SubscriptionPlans
, для которых существует SubscriptionOrder
с 4
в качестве user_id
.