2009-12-05 69 views
0

給定一組非常標準的相關表,如Customers,Invoices和Line Items。我需要提供一個查詢,例如「選擇所有具有5個或更多訂單項的發票的客戶」或「選擇所有擁有2個以上發票的客戶」或最後選擇「所有訂單項總額超過100美元的客戶」複雜的SQL查詢幫助

我現在正在努力實現這一目標(手動遍歷所有記錄),我知道這是最低效的方法,但我不知道構建這些查詢的足夠的SQL。我使用PHP5,MySQL和CakePHP 1.25。

回答

0

開始通過將它們放在一起:

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 

要超過5個項目或搜索結果進行過濾的客戶,請添加:

having count(li.id) >= 5 

過濾擁有兩張或多張發票的客戶比較棘手,因爲我們正在加入lineitems表。每張發票可能有多行。如此算只有唯一的發票,我們必須添加distinct到計數,如:

having count(distinct i.id) >= 2 

要在項目超過100 $篩選客戶,增加:

having sum(li.cost) > 100 

您可以使用數學裏面的sum,以防您存儲單獨的訂單項數量和價格:

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

對於前兩個,您可以使用GROUP BYHAVING COUNT(*)>4,對於最後一個,您可以使用SUM(field)

如果你想要SQL,那麼請顯示你的嘗試。

0

假設您有:

customers.id

line_items.user_id

line_items.numItems

查詢看起來像:

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

WHERE條款將改變依賴Ø ñ你想要返回。

有一段時間沒有與SQL Joins一起工作,但我認爲這是類似的東西。

0

下面是一些幫助,第二個應該讓你去:

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