【问题标题】:SQL Query to return only one row when id is found in multiple rows from another table当在另一个表的多行中找到 id 时,SQL 查询仅返回一行
【发布时间】:2020-07-19 20:59:56
【问题描述】:
我是 SQL 新手,遇到一个看似简单的问题,但我不知道该怎么办。
我有两张桌子,一张用于付款,一张用于证书。
我想返回所有满足其 public_key 存在于支付表内未支付行中的条件的证书。我尝试使用 join,但当我只需要证书时,它会返回所有付款请求。
这是付款表:
这是证书表:
这是我尝试使用 JOIN 的方法:
SELECT *
FROM certificate
WHERE created_at BETWEEN '${beginDate}' AND '${endDate}'
LEFT JOIN payment ON certificate.public_key = payment.certificate_id;
【问题讨论】:
标签:
mysql
sql
join
subquery
【解决方案1】:
我想返回所有满足条件的证书,即它们的 public_key 存在于支付表中的未支付行中。
如果我没听错的话,你可以使用exists:
select c.*
from certificate c
where exists (
select 1
from payment p
where
p.certificate_id = c.public_key
and created_at BETWEEN :beginDate AND :endDate
and p.status = 'unpaid'
)
请注意,根据您的问题描述,我在payment(status) 上添加了过滤条件。
这种方法的好处是,如果payment 表中有不止一个匹配的“未付费”行,它不会复制certificate 行。
【解决方案2】:
我想返回所有满足条件的证书,即它们的 public_key 存在于支付表中的未支付行中。
这会暗示这样的事情:
SELECT c.*
FROM certificate c JOIN
payment p
ON c.public_key = p.certificate_id;
WHERE c.created_at BETWEEN ? AND ?
不需要外连接,JOIN 是FROM 子句中的运算符。