2014-09-03 48 views
0

我用下面的表格數據庫條款:MySQL的 - 基於衝突的回父記錄凡子記錄

訂單,線,供應商

該行表有FKS的訂單和線表:

ORDER_ID,supplier_id

我想編寫一個查詢將返回的,具有從某些供應商的至少一條線順序記錄的計數但沒有任何其他供應商的線路。

因此,只有1行的訂單,但該行來自給定的供應商的訂單將被計入。

另一方面,來自給定供應商的訂單數量爲100行,但僅來自任何其他供應商的訂單數量不會被統計。

我可以很容易地計算出至少有一行的訂單,但我堅持使用其他供應商的行來排除訂單。

SELECT 
COUNT(DISTINCT(orders.id)) AS count 
FROM orders 
INNER JOIN lines 
ON lines.order_id = orders.id 
WHERE 
lines.supplier_id = 1 

是否有一個簡單的方法來做到這一點(最好沒有一個子查詢,因爲我在這裏已經是一個更大的查詢的一部分)?

任何意見讚賞。

感謝

回答

2

粗糙的咖啡預先猜測:

SELECT orders.id, SUM(lines.supplier_id = 1) AS wanted, 
    SUM(lines.supplier_id <> 1) AS unwanted 
FROM orders 
INNER JOIN lines lines.order_id = orders.id 
GROUP BY orders.id 
HAVING unwanted = 0 AND wanted > 0 

基本上是:抓住所有的訂單,並使用一個方便的mysql的黑客在上面走的SUM您的供應商ID比較和自動的布爾結果將它們轉換爲整數10。使用此「計數」來確定哪些訂單包含您想要的供應商,以及任何其他供應商的「總和」爲0。

0
select count(*) from orders o 
where exists (
    select 1 from lines l 
    where l.order_id = o.id 
    and l.supplier_id = 1 
) and not exists (
    select 1 from lines l 
    where l.order_id = o.id 
    and l.supplier_id <> 1 
) 

這種查詢可以採取指數的優勢lines(order_id,supplier_id)