【问题标题】: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 ?
    

    不需要外连接,JOINFROM 子句中的运算符

    【讨论】:

      猜你喜欢
      • 2013-11-12
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      相关资源
      最近更新 更多