2011-05-17 19 views
11

Aşağıdakilerin neden çalışmadığını bana söyleyebilir mi? İki seçim arasında birleştirme anahtarı sözcüğü yakınında bir sözdizimi hatası şikayet ediyor.İki seçim deyimine katılma

SELECT * 
FROM (select * from orders_products inner JOIN orders ON orders_products.orders_id = orders.orders_id where products_id = 181) 
as A 

join 

SELECT * 
FROM (select * from orders_products INNER JOIN orders ON orders_products.orders_id = orders.orders_id where products_id = 180) 
as B 

on A.orders_id=B.orders_id 

Temelde benim ilk SELECT bir tablodan bir ürüne yönelik tüm sipariş bilgileri çeker ve başka sipariş miktarını çeker ve bunları birbirine katılır. İkinci SELECT, başka bir ürün için aynı şeyi yapar.

Şimdi, başka ben Belki burada bir yanlış yaklaşım alıyorum


Q_ID P_ID1 Q1 P_ID2 Q2
1 180 3 181 11
2 180 9 181 6
3 180 5 181 3

almak istiyorum katılmak kullanarak,

_______A_________   _______B_________
O_ID P_ID Q O_ID P_ID Q
1 180 3 1 181 11
2 180 9 2 181 6
3 180 5 3 181 3

içeriz. Baska öneri?

GÜNCELLEME: İşte RedFilter tarafından işaretçiler sonra benim için çalıştı budur:

(SELECT * 
FROM (
SELECT * FROM orders_products 
INNER JOIN orders ON orders_products.orders_id = orders.orders_id 
WHERE products_id =181) AS A 
LEFT JOIN (
SELECT * FROM orders_products 
INNER JOIN orders ON orders_products.orders_id = orders.orders_id 
WHERE products_id =180) AS B ON A.orders_id = B.orders_id 
) 
UNION (
SELECT * 
FROM (
SELECT * 
FROM orders_products 
INNER JOIN orders ON orders_products.orders_id = orders.orders_id 
WHERE products_id =181 
) AS C 
RIGHT JOIN (
SELECT * 
FROM orders_products 
INNER JOIN orders ON orders_products.orders_id = orders.orders_id 
WHERE products_id =180 
) AS D ON C.orders_id = D.orders_id 
) 
+3

ummm tüm katılmadan gereksiz biraz .... görünüyor – Neal

+1

Bunu sorgudan almak istiyorum ne tarif edebilir misiniz? Daha verimli bir yol olabilir. –

cevap

31

değil yapmaya çalışıyoruz, ancak iki seçme maddeler bulunmaktadır emin. Onun yerine bunu yap:

SELECT * 
FROM (select * from orders_products inner JOIN orders ON orders_products.orders_id = orders.orders_id where products_id = 181) 
as A 

join 

(select * from orders_products INNER JOIN orders ON orders_products.orders_id = orders.orders_id where products_id = 180) 
as B 

on A.orders_id=B.orders_id 

Güncelleme:

Muhtemelen böyle bir şey bunu azaltabilecek: Farklı resultsets birleştirmek istiyorsanız

select o.orders_id, op1.products_id, op1.quantity, op2.products_id, op2.quantity 
from orders o 
inner join orders_products op1 on o.orders_id = op1.orders_id 
inner join orders_products op2 on o.orders_id = op2.orders_id 
where op1.products_id = 180 
    and op2.products_id = 181 
+0

Cevabınızı iki kez kontrol etmelisiniz, OP'nin sorusu içinde tam olarak yazdığı şey tam olarak budur. –

+3

@maple_shaft bu şekilde görünebilir, ancak 'JOIN' deyiminden sonra SELECT * FROM'ünü kaldırdım. – RedFilter

+0

ve bu hile yaptı. Üzgünüm, ilk başta belirsiz olan soru, ama daha fazla ayrıntı eklerken siz cevapları paylaştınız ve bu da istediğimi yapmaya başladı. – Codrguy

7

Sen UNION kullanmalıdır. Aşağıdakileri deneyin:

(SELECT * 
FROM (select * from orders_products inner JOIN orders ON orders_products.orders_id = orders.orders_id where products_id = 181) 
as A) 
UNION 
(SELECT * 
FROM (select * from orders_products INNER JOIN orders ON orders_products.orders_id = orders.orders_id where products_id = 180) 
as B 
on A.orders_id=B.orders_id) 
+0

Sözdizimi yanlış gösteriyor –

3

İstediğin yapacak:

select * 
    from orders_products 
     INNER JOIN orders 
      ON orders_products.orders_id = orders.orders_id 
where products_id in (180, 181);