【问题标题】:Mysql adding aliases, with complicationsMysql添加别名,有并发症
【发布时间】:2011-03-10 11:52:21
【问题描述】:

所以我建立了一个预订系统,但我在一些价格计算方面遇到了一些问题。

原来我有

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'

并给我以下错误

'where'中的未知列'c_id' 子句'

有什么想法吗?这应该输出一个酒店列表(来自 c_content 表的值),以及每个酒店的价格。价格由各个日期的总和组成,但还要考虑到多间房,以及不同价格的混合房型。

【问题讨论】:

    标签: mysql subquery alias add


    【解决方案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

    【讨论】:

    • 很好,我已经按照你说的做了,现在解决了这个问题,但是这意味着摆脱房间类型/价格查询的别名并将它们加在一起,这意味着我不会如果我也需要的话,可以分开房价(客户实际上只是要求)。我更喜欢你的解决方案 :) 非常感谢!
    【解决方案2】:

    不是最终的解决方案,更喜欢 Jeff Parkers,但这是我用来在短期内解决它的查询

    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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      相关资源
      最近更新 更多