首页 > 解决方案 > 如何在 SQLite 数据库中跨多个表创建过滤器?

问题描述

我正在寻找一种在我的 SQL 数据库中的几个表中创建多个过滤器的方法。我需要数据的 2 个表是OrderOrderDetailsOrder表格是这样的:

------------------------------------
| OrderID | CustomerID | OrderDate | 
------------------------------------

OrderDetails表格是这样的:

----------------------------------
| OrderID | ProductID | Quantity | 
----------------------------------

我想让它计算特定 OrderID 在一天内弹出的实例数。例如,它将选择一个OrderIDinOrder然后将其与OrderIDs in匹配OrderDetails,计算它在 in 中弹出的次数OrderDetails

-----------------------------------------------------------
| OrderID | CustomerID | OrderDate | ProductID | Quantity |
-----------------------------------------------------------

我使用的代码如下:

# Execute SQL Query (number of orders made on a particular day entered by a user)
cursor.execute("""
SELECT 'order.*', count('orderdetails.orderid') as 'NumberOfOrders'        
from 'order'
left join 'order'
on ('order.orderid' = 'orderdetais.orderid')
group by
    'order.orderid'
""")
print(cursor.fetchall())

此外,当我应该得到 3 时,我得到的当前输出是这样的:

[('order.*', 830)]

标签: pythonsqlite

解决方案


您的直接问题是您滥用单引号的使用。如果您需要引用标识符(表名、列名等),那么您应该在 SQLite 中使用双引号(这实际上是 SQL 标准)。order.*并且根本不应该引用诸如此类的表达式。您还可以自行加入订单表,而您可能想要带上订单详细信息。

你似乎想要:

select
    o.orderID,
    o.customerID,
    o.orderDate,
    count(*) number_of_orders
from "order" o
left join orderdetails od on od.orderid = o.orderid
group by o.orderID, o.customerID, o.orderDate

order是一个语言关键字,所以我确实引用了它 - 该表会更好地命名orders,以避免名称冲突。其他标识符这里不需要引用。

由于您想要的orderdetails只是计数,因此您还可以使用子查询而不是聚合:

select 
    o.*,
    (select count(*) from orderdetails od where od.orderid = o.oderid) number_of_orders
from "order" o

推荐阅读