2013-05-20 2 views
0

order_id, item, quantity의 세 가지 열이있는 SQLite 데이터베이스 테이블이 있습니다. 각 행에는 order_id, 항목 및 수량이 있습니다. 나는 두 가지 항목이 포함 된 주문 발견 쿼리 작성하려고하고Python을 사용하여 SQLite에서 AND 문 구성

(항목 1과 항목 2), 내 출력이 같은 모양으로 :

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 문을 이해할 수 없습니다. 당신은 내부에 필요

+2

이것은 파이썬이나 SQLite 질문이 아니라 순수한 SQL 질문입니다. –

답변

2

order_idOrder 테이블을 조인 :

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) 
+0

그래서 이것을 해석하면 기본적으로 item1에서 검색 한 다음 order_table_1 테이블을 만든 다음 item2에서 검색하여 order_table_2를 만든 다음 두 테이블에서 INNER JOIN을 수행합니다. 미안하지만 초등학생이다. 그것은 SQL에서의 첫 번째 찌르기입니다. – rwjones

+0

기본적으로 작업 순서를 제외하고 올바른 것입니다. '주문'테이블이 이미 있습니다. 'INNER JOIN'이 먼저 수행되고, o1.order_id = o2.order_id 일 때마다'o1' ('Orders'의 첫 번째 복사본)의 행을'o2'의 행과 조인합니다. 행이 가로로 결합되어 있다고 생각하십시오. 당신은 큰 테이블로 끝납니다. 이 큰 테이블은'WHERE' 조건에 의해 감소됩니다. – unutbu

+0

다음은 [조인에 대한 시각적 설명]입니다 (http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html). – unutbu

0

당신이 자신을하려는 항목 1과 다음 항목 2를 모든 주문을 원하는 경우에 가입하고 그 출력은

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 
+0

감사합니다. 나는 그것을 처리 할 수 ​​있다고 생각한다. – rwjones

0
시도

여기에는 count 하위 쿼리와 내부 조인을 사용하는 다른 방법이 있습니다.

# 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() 
관련 문제