Karmaşık SQL Sorgu Yardım

4 Cevap php

Müşteriler, Faturalar ve Hat Kalemleri gibi ilgili tablolar oldukça standart bir dizi göz önüne alındığında. Ben "5 satır öğeleri veya daha fazla olması faturaları tüm müşterileri seç" veya "fazla 2 faturaların tüm müşterileri seç" ya da son olarak "fazla 100 $ toplam satır öğeleri olan tüm müşterilerin seç" gibi bir sorgu yapmak gerekir

Ben (el ile tüm kayıtlar ile yürüyüş) şimdi bu zor yolu yapıyorum ve bunu en verimsiz yol olduğunu biliyorum ama ben bu sorguları oluşturmak için yeterli SQL bilmiyorum. Ben PHP5, MySQL ve CakePHP'ye 1.25 kullanıyorum.

4 Cevap

Onları hep birlikte katılarak başlayın:

select c.id
from customers c
left join invoices i on i.customer_id = c.id
left join lineitems li on li.invoice_id = i.id
group by c.id

Fazla 5 satır öğeleri veya müşterilerine daha filtrelemek için, ekleyin:

having count(li.id) >= 5

Biz LineItems tablo katılmadan konum beri iki ya da daha fazla faturalar ile müşterilerine filtreleme, zordur. Fatura başına birden çok satır olabilir. Yani sadece benzersiz faturalar saymak, bizim gibi, distinct saymak eklemek gerekir:

having count(distinct i.id) >= 2

Kalemlerinde fazla 100 $ ile müşterilerine filtrelemek için, ekleyin:

having sum(li.cost) > 100

Siz durumda ayrı bir satır öğesi sayar ve fiyatlar saklıyorsanız, sum içinde matematik kullanabilirsiniz:

having sum(li.itemcount * li.itemcost) > 100

İlk iki için, GROUP BY ve HAVING COUNT(*)>4 ve kullanabileceğiniz son biri için kullanabileceğiniz SUM(field).

Eğer SQL istiyorsanız girişimde göstermek lütfen.

Eğer vardı ki:

customers.id

line_items.user_id

line_items.numItems

Sorgu gibi görünecektir:

SELECT * FROM customers
JOIN line_items
ON line_items.user_id WHERE line_items.numItems > 5

Sizin WHERE fıkra dönmek istediğini bağlı olarak değişecektir.

Bir süre SQL Joins ile çalıştı, ama ben böyle bir şey düşünmüyorum var.

Burada gitmem gerekiyor ikincisi ile bazı yardımcı olmaktır:

   SELECT customer_id, COUNT(*) AS num_invoices
     FROM invoices
 GROUP BY customer_id 
   HAVING COUNT(*) > 2