0

我有一个包含三列的 SQLite 数据库表:order_id、item、数量。每行都有一个 order_id、一个项目和一个数量。

我正在尝试编写一个查询来查找包含两个不同项目(item1 和 item2)的订单,因此我的输出看起来像这样:

order_id | item   | quantity
---------------------------
1234     | item1  |  7
---------------------------
1234     | item2  |  2
---------------------------
5678     | item1  |  5
---------------------------
5678     | item2  |  3

这是我到目前为止拼凑的代码:

cur.execute("SELECT * FROM Orders WHERE term=? AND term=?", [("item1"), ("item2")])

如果我使用一个OR语句,我会得到我所期望的。我从逻辑上理解为什么这不起作用AND,但我无法弄清楚使它起作用的 SQL 语句。

4

3 回答 3

2

您需要在以下位置内连接两个Orderorder_id

sql = '''SELECT o1.*, o2.*
FROM Orders as o1
INNER JOIN Orders as o2
ON o1.order_id = o2.order_id
WHERE o1.item = ?
    AND o2.item = ?'''

args = ("item1", "item2")
cur.execute(sql, args)
于 2013-05-20T14:27:08.933 回答
0

这是另一种方式,使用计数子查询和内部连接。

# setup
import sqlite3
cnxn = sqlite3.connect(':memory:')
cursor = cnxn.cursor()
cursor.execute("CREATE TABLE Orders (order_id integer, item text, quantity integer)")
cursor.executemany("""
    INSERT INTO Orders (order_id, item, quantity) 
    VALUES (?, ?, ?)
""", [(1234, 'item1', 7), (1234, 'item2', 4), (4567, 'item1', 3)])

# answer
cursor.execute("""
    SELECT Orders.order_id, Orders.item, Orders.quantity 
    FROM Orders 
    INNER JOIN (SELECT order_id, COUNT(order_id) AS cnt FROM Orders GROUP BY order_id) Orders_count
    ON Orders.order_id = Orders_count.order_id
    WHERE Orders_count.cnt > 1
""")

results = cursor.fetchall()
# [(1234, u'item1', 7), (1234, u'item2', 4)]
cnxn.close()
于 2013-05-20T14:42:39.400 回答
0

如果您想要所有具有 item1 和 item2 的订单,那么您想要一个自连接并且该输出尝试

Select * From (    
select * from sometable I1
    inner join someTable i2 on I1.Order_Id = I2.Order_ID
    Where I1.item = 'item1' and I2.Item = 'item2'
    union  
    select * from sometable I2
    inner join someTable i1 on I2.Order_Id = I1.Order_ID
    Where I2.item = 'item2' and I1.Item = 'item1'
) both 
order by Order_id,item, quantity desc
于 2013-05-20T14:30:53.610 回答