2011-03-25 153 views
3

我在這裏要求一個可怕的 - 但也許一些SQL大師可以告訴我如何提取我想要的數據並保存我10個小時的谷歌時間(TM)?需要幫助棘手的MySQL查詢

這是我的表,其中只顯示相關字段:

**event** 
id 
cust_id 
.... 

**art** 
id 
art_name 
... 

**event_art** 
event_id 
art_id 
... 

**price** 
cust_id 
art_id 
price 
... 

價格在「價格」與DB用戶ID「0」是標準價格,如果一個條目與art_id和CUST_ID是客戶,具體價格爲這篇文章的存在。

我有什麼是CUST_ID和我有什麼輸出現在只是客戶的具體價格與SQL:

SELECT * FROM price WHERE cust_id='{$custID}' 

但我想包括價格之前訂購的物品,即使他們不有一個客戶特定的價格。

所以我需要的是:

獲取所有的ID從表事件,其中的cust_id = CUSTID

獲取有關這些訂單的所有不同的物品的ID從表event_art

如果不存在條目,則使用custID或價格表輸出「art」和「price」中的物品的「id」和「art_name」。

對我來說,這聽起來像是一個多線JOIN,這有點超出了我的SQL知識範圍。有人可以幫我解決問題嗎?可以指點我一個處理類似問題的指南,或者...是什麼?

在此先感謝!

回答

4
SELECT art_id, price 
FROM price 
WHERE cust_id = $cust_id 
UNION ALL 
SELECT art_id, price 
FROM (
     SELECT DISTINCT art_id 
     FROM event e 
     JOIN event_art ea 
     ON  ea.event_id = e.id 
     WHERE e.cust_id = $cust_id 
       AND ea.art_id NOT IN 
       (
       SELECT art_id 
       FROM price 
       WHERE cust_id = $cust_id 
       ) 
     ) e 
JOIN price p 
ON  p.cust_id = 0 
     AND p.art_id = e.art_id 

確保(cust_id, art_id)(按照這個順序)是PRIMARY KEYprice一個UNIQUE INDEX

0

不得不做出一些小的變化,表示該表是其中的SQL使用,但幾乎複製粘貼&所以不壞:P

SELECT price.art_id, price.price 
FROM price 
WHERE cust_id =114 
UNION ALL 
SELECT e.art_id, p.price 
FROM (

SELECT DISTINCT art_id 
FROM event e 
JOIN event_art ea ON ea.event_id = e.id 
WHERE e.cust_id =114 
AND ea.art_id NOT 
IN (

SELECT price.art_id 
FROM price 
WHERE cust_id =114 
) 
)e 
JOIN price p ON p.cust_id =0 
AND p.art_id = e.art_id 
0
SELECT DISTINCT 
    a.id, 
    a.art_name, 
    COALESCE(p.price, p0.price) AS price 
FROM event e 
    INNER JOIN event_art ea ON e.id = ea.event_id 
    INNER JOIN art a ON ea 
    LEFT JOIN price p ON p.art_id = a.id AND p.cust_id = e.cust_id 
    LEFT JOIN price p ON p.art_id = a.id AND p.cust_id = 0