Mysql 添加别名,有并发症

标签 mysql subquery alias add

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

原来我有

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'

并给我以下错误

Unknown column 'c_id' in 'where clause'

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

最佳答案

子选择可能会成为性能 killer ,应尽可能避免。嵌套的子选择要邪恶很多倍,并且会导致类似于您遇到的范围问题。我建议删除所有子子选择,如果您有时间,重写查询,使其根本不需要子选择。

与此同时,我认为类似以下内容应该可以解决您的范围界定问题。

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

关于Mysql 添加别名,有并发症,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5259253/

相关文章:

mysql - 如何在 MySQL 中为数据库起别名?

php - 我的 SELECT 语句不能正确处理表单提交的变量

php - 排队 mysql 查询的最佳方法是什么?在速度方面

mysql - 当我输入 non 时,它需要显示 1 和 12 年

mysql - 在 mysql 5.5.25 中使用的正确语法表示不存在

MySQL 子查询的奇怪行为

mysql - 带有子选择和多行的 SQL 插入

sql - ORA-00972 : Identifier is too long

sql - MySQL : How do I use Count on a Sub-Query?

function - 为什么这个Powershell更改目录的功能不起作用?