如何将列值传递给'嵌套'子查询

时间:2016-11-09 15:30:29

标签: mysql

说明: 基本上它是一个2D网格。

目标:计算特定位置(蓝色单元格)周围特定范围(红色方块)的奖励(绿色单元格)总和。

enter image description here

注意:坐标可能是负数。

蓝色单元格是特定位置,位于T1表格中。

表T1:

x, y

绿色细胞是特定坐标处具有不同值的奖励,位于T2表中。

表T2:

x, y, bonus

要计算最终奖金,请从T2获得绿色奖金(LIMON 3 BY BONUS DESC),这些奖金在7码×7的正方形内,以T1的蓝色单元为中心。

在此示例中,此蓝色单元格的答案(计算的奖励)为20 + 15 + 10。

我对MySQL中的连接和子查询有点新意,所以对我来说解释问题是非常复杂的,所以我将主要显示代码。

以下是我的查询。这个有效,因为我在子查询中强制坐标(见-10和-100),但我需要用c.x和c.y替换这些值-10和-100。

问题是我不能使用'c'。

我收到以下错误:'where子句'中的未知列'c.x'。

SELECT 
    c.x, 
    c.y,
    (
        SELECT Sum(bonus) AS bonus
        FROM
        (
            SELECT bonus
            FROM t2
            WHERE Abs(-10 - x) <= 3 
            AND Abs(-100 - y) <= 3 
            ORDER BY bonus DESC
            LIMIT 3
        ) AS sub
    ) AS bonus
FROM t1 AS c

然后我尝试了CROSS JOIN,同样的问题。

SELECT
    c.x, 
    c.y
FROM t1 AS c
CROSS JOIN
(
    SELECT Sum(bonus) AS bonus
    FROM
    (
        SELECT bonus
        FROM t2
        WHERE Abs(-10 - x) <= 3 
        AND Abs(-100 - y) <= 3 
        ORDER BY bonus DESC
        LIMIT 3
    ) AS sub
) AS b

注意:

  • 如果奖金查询没有子查询但我必须使用一个 因为我需要一个限制,如果你这个数额限制适用 不要使用子查询。
  • 解决方案是使用多个查询来完成。
  • 我也试过别名,但同样的问题。

2 个答案:

答案 0 :(得分:0)

然后你可能希望JOIN喜欢

SELECT 
    c.x, 
    c.y, sub.bonus
FROM t1 AS c JOIN
    (
        SELECT Sum(bonus) AS bonus
            FROM t2
            WHERE Abs(-c.x - x) <= 3 
            AND Abs(-c.y - y) <= 3 
            ORDER BY bonus DESC
            LIMIT 3
        ) as sub ON c.Id = sub.Id;

答案 1 :(得分:-1)

我相信这会做你想做的事情

func formatHour(hour:Int) -> String {

    return (String(hour).characters.count == 1) ? "0\(hour)" : "\(hour)"
}

let hour = 5

print("\(formatHour(hour: hour))") // output "05"