2011-03-10 61 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