2011-03-10 43 views
1

因此,我建立了預訂系統,並且在計算某些價格時遇到了一些問題。Mysql添加別名,併發症

我原本

SELECT c_id, c_title, c_imgdrop, c_link, c_text4, 
    (SELECT SUM(bd_price) as price FROM booking_dates WHERE site_id = '15' AND bd_room_type IN ('single','double') AND bd_date IN ('2011-03-05') AND bd_h_id = c_id) AS sum_price 
FROM c_content 
JOIN (SELECT bd_h_id FROM booking_dates WHERE site_id = '15' AND bd_date IN ('2011-03-05') AND bd_available <= '1' AND bd_room_type = 'single' AND bd_price > '0' GROUP BY bd_h_id HAVING count(*) = '1') q_0 ON c_content.c_id = q_0.bd_h_id 
JOIN (SELECT bd_h_id FROM booking_dates WHERE site_id = '15' AND bd_date IN ('2011-03-05') AND bd_available <= '1' AND bd_room_type = 'double' AND bd_price > '0' GROUP BY bd_h_id HAVING count(*) = '1') q_1 ON c_content.c_id = q_1.bd_h_id 
WHERE site_id = '15' 

這工作得很好,但它沒有很好地工作,如果你試圖計算同類型

的多種房型可供反正我試圖查詢出拆分室類型,並按預訂中該類型的房間數乘以價值。我正在使用這個(Adding MySQL alias fields together),這意味着我不得不添加一個額外級別的子查詢,這會讓事情混淆一點。

我幾乎在那裏,但它不承認我的子查詢中的字段名之一,我期望由於它執行查詢的順序。

我現在擁有的是:

SELECT c_id, c_title, c_imgdrop, c_link, c_text4, 
    (SELECT sum_price_single, sum_price_double, sum_price_single + sum_price_double AS sum_price FROM 
     (SELECT 
      ((SELECT SUM(bd_price) as price FROM booking_dates WHERE site_id = '15' AND bd_room_type = 'single' AND bd_date IN ('2011-03-05') AND bd_h_id = c_id) * 1) AS sum_price_single, 
      ((SELECT SUM(bd_price) as price FROM booking_dates WHERE site_id = '15' AND bd_room_type = 'double' AND bd_date IN ('2011-03-05') AND bd_h_id = c_id) * 1) AS sum_price_double 
      FROM booking_dates 
     ) 
    x) 
FROM c_content 
JOIN (SELECT bd_h_id FROM booking_dates WHERE site_id = '15' AND bd_date IN ('2011-03-05') AND bd_available <= '1' AND bd_room_type = 'single' AND bd_price > '0' GROUP BY bd_h_id HAVING count(*) = '1') q_0 ON c_content.c_id = q_0.bd_h_id 
JOIN (SELECT bd_h_id FROM booking_dates WHERE site_id = '15' AND bd_date IN ('2011-03-05') AND bd_available <= '1' AND bd_room_type = 'double' AND bd_price > '0' GROUP BY bd_h_id HAVING count(*) = '1') q_1 ON c_content.c_id = q_1.bd_h_id 
WHERE site_id = '15' 

,並給我下面的錯誤

未知列 '其中 條款'

任何想法 'C_ID'?這應該輸出酒店列表(來自c_content表的值)以及每個酒店的價格。價格包括各種日期的總和,但也必須考慮到多個房間,以及具有不同價格的混合房間類型。

回答

1

子選擇可以是一個性能殺手,應儘可能避免。嵌套的子選擇會更惡劣,並且會導致與您遇到的問題類似的範圍問題。我建議刪除所有的子子選擇,如果你有時間的話,重寫查詢,以便它根本不需要子查詢。

與此同時,我認爲,類似下面的內容應該可以解決您的範圍問題。

SELECT *, sum_price_single + sum_price_double AS sum_price FROM (
    SELECT c_id, c_title, c_imgdrop, c_link, c_text4, 
     (SELECT SUM(bd_price) * 1 as price FROM booking_dates WHERE site_id = '15' AND bd_room_type = 'single' AND bd_date IN ('2011-03-05') AND bd_h_id = c_id) AS sum_price_single, 
     (SELECT SUM(bd_price) * 1 as price FROM booking_dates WHERE site_id = '15' AND bd_room_type = 'double' AND bd_date IN ('2011-03-05') AND bd_h_id = c_id) AS sum_price_double 
    FROM c_content 
    JOIN (SELECT bd_h_id FROM booking_dates WHERE site_id = '15' AND bd_date IN ('2011-03-05') AND bd_available <= '1' AND bd_room_type = 'single' AND bd_price > '0' GROUP BY bd_h_id HAVING count(*) = '1') q_0 ON c_content.c_id = q_0.bd_h_id 
    JOIN (SELECT bd_h_id FROM booking_dates WHERE site_id = '15' AND bd_date IN ('2011-03-05') AND bd_available <= '1' AND bd_room_type = 'double' AND bd_price > '0' GROUP BY bd_h_id HAVING count(*) = '1') q_1 ON c_content.c_id = q_1.bd_h_id 
    WHERE site_id = '15' 
) AS t1 

本質上是將核心子查詢向上移動兩個級別,然後將單倍和雙倍的「總和」包裝到外部選擇中。要確認,這不是最佳的......但它應該解決您的直接問題。午飯後,我可能會重新考慮這個問題:P

+1

尼斯一個查詢,我已經做了正如你所說,現在解決了這個問題,然而它意味着擺脫房間類型/價格查詢的別名,並將它們加在一起,這意味着如果我需要的話,我也不能分割出房價。客戶字面上只是要求)。我更喜歡你的解決方案:) Thx非常好! – Horse 2011-03-10 12:51:56

+0

你絕對歡迎:) – 2011-03-10 12:55:41

0

不是最終的解決方案,因爲喜歡傑夫·帕克,但這裏是我用來解決它在短期內

SELECT c_id, c_title, c_imgdrop, c_link, c_text4, 
((SELECT SUM(bd_price) as price FROM booking_dates WHERE site_id = '15' AND bd_room_type = 'single' AND bd_date IN ('2011-03-05') AND bd_h_id = c_id) * 1) 
+ 
((SELECT SUM(bd_price) as price FROM booking_dates WHERE site_id = '15' AND bd_room_type = 'double' AND bd_date IN ('2011-03-05') AND bd_h_id = c_id) * 1) AS sum_price 
FROM c_content 
JOIN (SELECT bd_h_id FROM booking_dates WHERE site_id = '15' AND bd_date IN ('2011-03-05') AND bd_available <= '1' AND bd_room_type = 'single' AND bd_price > '0' GROUP BY bd_h_id HAVING count(*) = '1') q_0 ON c_content.c_id = q_0.bd_h_id 
JOIN (SELECT bd_h_id FROM booking_dates WHERE site_id = '15' AND bd_date IN ('2011-03-05') AND bd_available <= '1' AND bd_room_type = 'double' AND bd_price > '0' GROUP BY bd_h_id HAVING count(*) = '1') q_1 ON c_content.c_id = q_1.bd_h_id 
WHERE site_id = '15' ORDER BY sum_price desc