MySQL: присоединиться к самой таблице. Неизвестный столбец

Сойти с ума!!!!

На Access работает, а на MySQL не хочет. И я беру трюк на пост здесь.

Здесь запрос:

SELECT A.B_ID,
       B.CNT_B,
       B.MAX_PRICE,
       B.SUM_AB,
       B.SUM_C_AB,
       B.UNIQUE_B,
       B.Costi,
       B.COUNTDOWN,
       A.AUCT_ID
FROM MONITOR AS A
INNER JOIN
  (SELECT B_ID,
          COUNT(B_ID) AS CNT_B,
          MAX(PREZZO_ATTUALE) AS MAX_PRICE,
          SUM(TOT_PUNT_AB) AS SUM_AB,
          SUM(TOT_CAMBI_AB) AS SUM_C_AB,
          (CNT_B-SUM_AB) AS UNIQUE_B,
          (0.035*3*CNT_B+MAX_PRICE) AS COSTI,
          45-SUM(CONT_PROVV_AB) AS COUNTDOWN
   FROM MONITOR
   WHERE AUCT_ID = '123456789'
   GROUP BY B_ID) AS B
  ON A.B_ID= B.B_ID
WHERE A.AUCT_ID = '123456789'
ORDER BY B.MAX_PRICE DESC,
         B.CNT_B DESC

показывает

ОШИБКА: [MySQL] [Драйвер ODBC 3.51] [mysqld-5.5.33-31.1-log] Неизвестный столбец «CNT_B» в «списке полей»

Если я выйду из CNT_B, он скажет мне MAX_PRICE и так далее.

Я уверен. Это проклятие INNER JOIN!

Здесь скрипка с ошибкой


РЕШЕНИЕ

Я не могу использовать значение ALIAS внутри того же подзапроса.

Таким образом, новый ДЕЙСТВИТЕЛЬНЫЙ запрос:

   SELECT A.B_ID,
           B.CNT_B,
           B.MAX_PRICE,
           B.SUM_AB,
           B.SUM_C_AB,
           B.UNIQUE_B,
           B.Costi,
           B.COUNTDOWN,
           A.AUCT_ID
    FROM MONITOR AS A
    INNER JOIN
      (SELECT B_ID,
              COUNT(B_ID) AS CNT_B,
              MAX(PREZZO_ATTUALE) AS MAX_PRICE,
              SUM(TOT_PUNT_AB) AS SUM_AB,
              SUM(TOT_CAMBI_AB) AS SUM_C_AB,
              (COUNT(B_ID)-SUM(TOT_PUNT_AB)) AS UNIQUE_B,
              (0.035*3*COUNT(B_ID)+MAX(PREZZO_ATTUALE)) AS COSTI,
              45-SUM(CONT_PROVV_AB) AS COUNTDOWN
       FROM MONITOR
       WHERE AUCT_ID = '123456789'
       GROUP BY B_ID) AS B
      ON A.B_ID= B.B_ID
    WHERE A.AUCT_ID = '123456789'
    ORDER BY B.MAX_PRICE DESC,
             B.CNT_B DESC

и SQL FIDDLE

Спасибо

Оскар


person Oscar Zarrus    schedule 02.11.2013    source источник
comment
Откуда C.MAX_PRICE?   -  person hjpotter92    schedule 02.11.2013
comment
Результаты из SHOW CREATE TABLE MONITOR были бы хорошими, но я заметил, что ваш запрос ссылается на C.MAX_PRICE, когда не указана таблица C, так что это должно быть исправлено. Дох, снайпер.   -  person zanlok    schedule 02.11.2013
comment
Я отредактировал сообщение с исправлением и SQLfiddle для примера ошибки   -  person Oscar Zarrus    schedule 02.11.2013


Ответы (2)


Поднимитесь от подзапроса к основному следующему:

 (CNT_B-SUM_AB) AS UNIQUE_B,
 (0.035*3*CNT_B+MAX_PRICE) AS COSTI,

Потому что вы пытаетесь вызвать Псевдоним из функции Computed Aggregate сам по себе.

Чтобы у вас было это:

SELECT A.B_ID,
   B.CNT_B,
   B.MAX_PRICE,
   B.SUM_AB,
   B.SUM_C_AB,
   B.CNT_B-B.SUM_AB AS UNIQUE_B,
   (0.035*3*B.CNT_B+B.MAX_PRICE) AS COSTI,
   B.COUNTDOWN,
   A.AUCT_ID
FROM MONITOR A
INNER JOIN
 (SELECT B_ID,
      COUNT(B_ID) AS CNT_B,
      MAX(PREZZO_ATTUALE) AS MAX_PRICE,
      SUM(TOT_PUNT_AB) AS SUM_AB,
      SUM(TOT_CAMBI_AB) AS SUM_C_AB,
      45-SUM(CONT_PROVV_AB) AS COUNTDOWN
FROM MONITOR
WHERE AUCT_ID = '3453015'
GROUP BY B_ID) B
ON A.B_ID= B.B_ID
WHERE A.AUCT_ID = '3453015'
ORDER BY B.MAX_PRICE DESC,
     B.CNT_B DESC

См. SQLFiddle.

person Edper    schedule 04.11.2013

Можете ли вы попробовать это, которое не ссылается на таблицу C:

SELECT A.B_ID,
       B.CNT_B,
       B.MAX_PRICE,
       B.SUM_AB,
       B.SUM_C_AB,
       B.UNIQUE_B,
       B.Costi,
       B.COUNTDOWN,
       A.AUCT_ID
FROM MONITOR AS A
INNER JOIN
  (SELECT B_ID,
          COUNT(B_ID) AS CNT_B,
          MAX(PREZZO_ATTUALE) AS MAX_PRICE,
          SUM(TOT_PUNT_AB) AS SUM_AB,
          SUM(TOT_CAMBI_AB) AS SUM_C_AB,
          (CNT_B-SUM_AB) AS UNIQUE_B,
          (0.035*3*CNT_B+MAX_PRICE) AS COSTI,
          45-SUM(CONT_PROVV_AB) AS COUNTDOWN
   FROM MONITOR
   WHERE AUCT_ID = '123456789'
   GROUP BY B_ID) AS B
  ON A.B_ID= B.B_ID
WHERE A.AUCT_ID = '123456789'
ORDER BY B.MAX_PRICE DESC,
         B.CNT_B DESC
person zanlok    schedule 02.11.2013
comment
Это то же самое. Я сделал и SqlFiddle. - person Oscar Zarrus; 02.11.2013
comment
Не уверен, что вы имеете в виду, что это то же самое. Ошибка все еще есть? Эта скрипка не показывает ошибку с моим предложенным изменением. - person zanlok; 05.11.2013
comment
Извините, zanlok, но если я скопирую/вставлю ваш запрос, он выдаст ту же ошибку. Наверное, я что-то упускаю. Во всяком случае, я решил, сделав тесты для каждого подзапроса. Если вы посмотрите здесь sqlfiddle.com/#!2/f10e3/1, вы увидите та же самая ошибка, которая выдала мне, которую я решил, избегая использования значений псевдонимов в одном и том же подзапросе. На самом деле, если вы видите свой запрос, например, (0,035*3*CNT_B+MAX_PRICE) AS COSTI [вместо (0,035*3*COUNT(B_ID)+MAX(PREZZO_ATTUALE) AS COSTI]] пытается использовать значение CNT_B и MAX_PRICE в том же запросе. И это то же самое, что и в моем первом запросе. - person Oscar Zarrus; 05.11.2013