gpt4 book ai didi

mysql - SQL - 内部联接以排除行

转载 作者:行者123 更新时间:2023-11-29 19:29:59 25 4
gpt4 key购买 nike

我在 Laravel 应用程序中有以下表格:

basket
------
id PK
user_id FK
coupon_id FK

basket_items
------------
id PK
basket_id FK
product_id FK
quantity
purchaseable_id
purchaseable_type -- e.g. App\Job, App\CV

products
--------
id PK
name -- e.g. standard job listing, premium job listing, cv download
price

jobs
----
id PK
product_id FK
title
start_dt
expiry_dt
description

cvs
------
id PK
name

basket_items表中的purchaseable_idpurchaseable_type是多态关系。例如。用户可以将一个工作添加到他们的购物篮中,这是一个高级产品列表 - 在这种情况下,purchase_id 将是工作表中的工作 ID,purchase_type 将是 App\Job。篮子项目表中的示例行可能如下所示:

id | basket_id | product_id | quantity | purchaseable_id | purchaseable_type
----------------------------------------------------------------------------
1 | 1 | 1 | 1 | 1 | App\Job
2 | 1 | 3 | 1 | 1 | App\CV

我想要列出用户的所有篮子商品,但如果可购买类型为 App\Job 并且作业已过期,则排除商品。

我已尝试以下操作,但如果作业已过期,它会排除所有行,即排除每个可购买类型的项目

select t1.*, t2.* 
from baskets t1
inner join basket_items t2 on t2.basket_id = t1.id
left join jobs t3 on t3.id = t2.purchaseable_id and t2.purchaseable_type = 'App\\Job'
where t1.user_id = 1 and t3.expiry_dt > now()

最佳答案

当使用左联接时,表中所有与联接条件不匹配的字段均为NULL。因此,在这种情况下,当您从 basket_itemsjobs 的联接与联接条件不匹配时,从 jobs 中提取的字段全部为 NULL 。由于如果 t3.expiry_dtNULL,则表达式 t3.expiry_dt > now() 将始终返回 false,因此您将无法取回这些记录。

解决这个问题的方法是更改​​ WHERE 子句以允许 NULL:

where t1.user_id = 1 and ( t3.expiry_dt > now() OR t3.expiry_dt IS NULL)

关于mysql - SQL - 内部联接以排除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41852777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com