【问题标题】:Changing a sql query using join instead of a subselect使用联接而不是子选择更改 sql 查询
【发布时间】:2014-02-04 12:15:36
【问题描述】:

我遇到了以下问题: 因为条目的数量可能会变得非常大,所以我想在 sql 查询中使用连接而不是子选择。

它涉及以下三个简化表:

devices:
- id

confirmation_requests:
- id
- filePath

confirmation
- id
- requestId (references confirmation_requests.id)
- deviceId (references devices.id)

目标是获取给定设备未确认的所有确认请求(在确认表中包含一个条目)。

我刚刚找到了一个使用普通子查询的解决方案,您可以在此处找到一个示例: http://sqlfiddle.com/#!2/13fd3/1

SELECT * 
FROM confirmation_requests 
WHERE id NOT IN (SELECT confirmation_request_id
                     FROM confirmations
                     WHERE device_id = 1);

谢谢!

【问题讨论】:

    标签: mysql sql join subquery


    【解决方案1】:

    您可以在表格上执行LEFT JOIN 以确认匹配device_id = 1 然后排除WHERE 子句中的那些:

    SELECT cr.* 
    FROM confirmation_requests cr
    LEFT JOIN confirmations c ON (cr.id = c.confirmation_request_id AND c.device_id = 1)
    WHERE c.id IS NULL;
    

    【讨论】:

    • 知道如何用 Propel 实现它吗?我试过了:$confirmationRequests = ConfirmationRequestQuery::create() ->leftJoin("Confirmation c") ->addJoinCondition("c","c.device_id = ?",$device->getId()) ->where("c.id IS NULL") ->find();
    • @user2362649 Propel 不是我以前用过的东西。作为一个新问题,您可能会更幸运地提出这个问题。
    • Mh .. 也许它不像我想的那样工作.. 假设我有 2 个设备(id:1 和 2)......并且设备 1 只有 2 个确认请求但确认表中没有条目...查询应该输出第一个设备的这两个请求...到目前为止工作正常...但是如果我为第二个设备调用它,我也会收到这两个请求。通常什么都不会出现,因为这两个请求属于第一个设备..
    • @user2362649 这不是我使用您的 SQL 小提琴看到的行为:sqlfiddle.com/#!2/13fd3/13 您能创建一个显示问题的小提琴吗?
    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 2011-11-15
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多