【问题标题】:SQL: Searching grand child table for specifc itemsSQL:在孙表中搜索特定项目
【发布时间】:2010-10-09 00:50:07
【问题描述】:

考虑以下架构:

顾客: 上校 |类型 | -------------------| 编号 |整数 | 姓名 | VARCHAR | 命令: 上校 |类型 | ----------------------| 编号 |整数 | 客户 ID |整数 | 日期 |日期 | 项目 上校 |类型 | ----------------------| 编号 |整数 | order_id |整数 | 姓名 | VARCHAR | 数量 |整数 |

这是架构的简要说明: 客户可以有很多订单,一个订单可以有很多商品 注意:您可能会争辩说,这些项目应该引用一些带有 product_id 的产品表,但让它像现在一样简单。

从我的数据库中,我想问以下问题:

对于给定的客户,列出所有以 La 开头的项目。

我的查询版本如下:

SELECT * FROM items WHERE name LIKE 'La%'

这将为所有客户返回所有以 La 开头的项目。我想要的是我得到一个特定客户的所有项目,比如 id 1。我该如何编写这样的查询?我的第二个版本是这样的:

SELECT * FROM items WHERE name LIKE 'La%' AND order_id in (SELECT id FROM orders WHERE customer_id=1);

但是他们是否还有其他高效/优雅或更好的方式来做同样的事情?

【问题讨论】:

    标签: sql


    【解决方案1】:

    执行此操作的优雅方式称为连接。

    SELECT
      c.id            customer_id,
      c.name          customer_name,
      i.id            item_id,
      i.name          item_name,
      COUNT(i.id)     order_count,
      SUM(i.quantity) items_ordered
    FROM
      customers c
      INNER JOIN orders o ON c.id = o.customer_id
      INNER JOIN items  i ON i.id = o.order_id
    WHERE
      i.name LIKE 'La%'
      AND c.id = 1
    GROUP BY
      c.id,
      c.name,
      i.id,
      i.name
    

    【讨论】:

    • 我也在写同样的答案,所以我支持它并投票。
    【解决方案2】:

    从客户 c 中选择 i.name
    加入订单o
    在 c.id = o.customer_id
    加入项目 i
    在 o.id = i.order_id 上,其中 c.id = WHATEVER_CUSTOMER_ID_YOU_WANT
    和 i.name LIKE 'La%'

    【讨论】:

      【解决方案3】:

      Sub-SELECT 是一种方法,另一种方法是加入表并查询。

      类似这样,我的 SQL 很生锈,但我认为这应该可以工作。

      SELECT c.Name, o.id, o.date, i.name, i.quantity FROM Customer AS c
      LEFT OUTER JOIN Orders AS o ON c.id = o.customer_id
      LEFT OUTER JOIN Items AS i on o.id = i.order_id
      WHERE i.name LIKE 'La%' AND c.id = 1
      

      【讨论】:

      • 生锈的 SQL 和寻找复杂答案的倾向(我目前正试图打破这种习惯,在复杂问题上花费的时间太长了)。你是对的,对于 OUTER JOIN 来说是不必要的,考虑到限制标准,即使是直接 JOIN 也足够了。
      猜你喜欢
      • 1970-01-01
      • 2020-10-10
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多