2016-03-22 15 views
1

Orada başlık, sorgudan neye ihtiyacım olduğunu tam olarak açıklayamıyor.Müşteriler için toplam siparişleri seçmek için MySql sorgusu

@sgeddes, aşağıdaki sorguyu oluşturmama yardımcı oldu, ancak sorgunun, gereksinimlerimi gerçekleştirmek için bazı değişiklikler yapması gerekiyor. Ayrıca silinen müşterileri seçmemek için sorguyu biraz değiştirdim, ancak bu sorgunun yazılma şeklinden dolayı çok fazla değişiklik yapamadım SQL bilgim.

SELECT d.customer_id,d.fname,d.lname,d.isactive, 
     o.lastdate, 
     Count(o2.order_id) AS 'total_orders' 
FROM customers d 
     LEFT JOIN (SELECT MAX(order_id) order_id, customer_id 
       FROM orders 
       GROUP BY customer_id) m on d.customer_id = m.customer_id 
     LEFT JOIN orders o on m.order_id = o.order_id 
     LEFT JOIN orders o2 on d.customer_id = o2.customer_id 
          AND o2.balance > 0 AND o2.isActive > -1 
WHERE d.user_id =945766 AND d.isActive > -1 
     AND o2.customer_id IS NULL 
GROUP BY d.customer_id 

Aşağıdaki üç gereksinime ihtiyacım var. isActive ile müşteri için

  1. sayım siparişler> -1 (-1 = silinmiş)
  2. Müşteriler siparişler değil tablosunda (hayır siparişlerde müşteri). isActive = 0 ve bunlara karşılık gelen sipariş ile
  3. Müşteriler tüm ihtiyacım isActive = 0 ile müşteri yani kısaca

saymak ve total_orders sütun için gerçek bir # alır.

Daha iyi bir şekilde yardım etme girişimim gereği, gereksinimi anlamış oldum, bir SqlFiddle oluşturdum.

Please see my SqlFiddle

+0

Bu sorgu başka bir amaç için tasarlanmış olabilir ve basit bir sorguya ihtiyaç duyduğunuzda bile daha karmaşık olabileceğini düzenlemek için olabilir ... bu yüzden ihtiyacınızın ne olduğunu bize bildirin. –

+0

Yani 3 ayrı sonuç için 3 ayrı sorgu istiyorsun? – Strawberry

+0

@strawberry. UNION tarafından birleştirilen 3 ayrı sorgu kullanıyordum ve önceki yazımda sgeddes tarafından önerildiği gibi, onun yerine sorgu sürümünü kullanmaya başladım. – wilson382

cevap

0

senin gereksinimi ardından aşağıdaki sorguları kullanabileceğiniz 3 puan sözü buysa

ayrı sorgu sonra kullanmak isterseniz

SELECT d.customer_id, d.fname, COUNT(o.order_id) AS Total_Orders 
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE d.isActive > -1 
GROUP BY d.customer_id; 

SELECT DISTINCT d.customer_id, d.fname 
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE o.customer_id IS NULL; 

SELECT d.customer_id, d.fname, COUNT(o.order_id) AS Total_Orders 
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE d.isActive = 0 
GROUP BY d.customer_id; 

aşağıda- Onları sendika ile birleştirmek istiyorsanız, aşağıdaki formu kullanın:

SELECT 'isactive>-1' AS 'status', d.customer_id, d.fname, COUNT(o.order_id) AS Total_Orders 
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE d.isActive > -1 
GROUP BY d.customer_id 
UNION ALL 
SELECT DISTINCT 'Customer without Order' AS 'status', d.customer_id, d.fname, COUNT(o.order_id) AS Total_Orders 
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE o.customer_id IS NULL 
UNION ALL 
SELECT 'isactive=0' AS 'status', d.customer_id, d.fname, COUNT(o.order_id) AS Total_Orders 
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE d.isActive = 0 
GROUP BY d.customer_id; 

Not: Ana sorgunuz, başka herhangi bir amaç için olabilecek son siparişi almaya çalışmaktadır; bu nedenle, tam gereksiniminizi sağlamanız durumunda, birisi size yardımcı olabilir.

+0

Lütfen bir göz atın http://postimg.org/image/5fy4fgs5j/ – wilson382

+0

Birleşme sırasında üzgünüm mysql terminatörü kaldırmayı unuttum ";" şimdi kaldırdım lütfen şimdi kontrol edin. –

+0

cevabınızı kabul ediyorum çünkü sorgunuz beklenen sonucumu döndürür, ancak ilk alt sorgu o.isActive = -1 (silinmiş siparişler) olarak sayılırken, ikinci alttan gelen sonuçları 'VE o.isActive> -1' eklediğimde sorgu (sipariş olmayan müşteriler) hepsi gitti. neden bilmiyorum. – wilson382

İlgili konular