Как объединить 2 таблицы, получив все строки из левой таблицы и только совпадающие строки в правой

Таблица 1

enter image description here

Таблица 2

enter image description here

Таблица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.

Вернуться на верх