2016-11-09 2 views
0

Пояснения: В основном это 2D-сетка.Как передать значение столбца в «вложенный» подзапрос

Цель: рассчитать сумму бонусов (зеленых ячеек) в определенном диапазоне (красный квадрат) вокруг определенных мест (синие ячейки).

enter image description here

NB: координаты могут быть отрицательными.

Синие ячейки являются конкретными местами и находятся в таблице T1.

Таблица Т1:

x, y 

Зеленые клетки бонусы с различными значениями в определенных координатах и ​​приведены в таблице T2.

Таблица Т2:

x, y, bonus 

Чтобы вычислить окончательный бонус, SUM зеленые бонусы (LIMIT 3, заказанного БОНУСНОЙ DESC) от T2, которые находятся в пределах квадрата размером 7 на 7, центрированный на синем клетке от Т1.

В этом примере ответ (расчетный бонус) для этой голубой ячейки будет 20 + 15 + 10.


Я вроде новой для соединения и подзапросы в MySQL, так что это действительно сложно для меня, чтобы объяснить вам, что эта проблема, так что я буду показывать в основном код.

Ниже мой запрос. Это работает, потому что я принудительно меняю координаты в подзапросе (см. -10 и -100), но мне нужно заменить эти значения -10 и -100 на c.x и c.y.

Проблема в том, что я не могу использовать 'c'.

Я получаю следующую ошибку: Неизвестный столбец 'c.x' в 'where clause'.


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 

NB:

  • Это будет работать, если бонусная запрос не имел, подзапрос, но я должен использовать один , потому что мне нужен предел и предел применяется после того, как сумма, если вы не используйте подзапрос.
  • Решение было бы сделать это с несколькими запросами.
  • Я также пробовал с псевдонимами, но с той же проблемой.
+0

@Strawberry Я добавил некоторую информацию. Но в следующий раз было бы неплохо спросить по-другому. – Ploppy

+0

Было бы хорошо предоставить запрошенную информацию. – Strawberry

+0

@Strawberry Это ты, кто ниспроверг? – Ploppy

ответ

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; 
+0

oh my bad, я заменил имена таблиц на «...», но на самом деле есть две разные таблицы. Я отредактировал вопрос соответствующим образом. – Ploppy

+0

@Ploppy, это имеет смысл сейчас. Я имею в виду редактирование в ответ. – Rahul

+0

Иды разные. Я не могу присоединиться. – Ploppy

-1

Я считаю, что это будет делать то, что вы хотите

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

Это не работает, я получаю ту же ошибку: Неизвестный столбец 'c.x' в 'where clause'. Я думаю, что эта ошибка происходит, потому что она находится в подзапросе. – Ploppy

Смежные вопросы