2013-05-03 6 views
1

Как вы ссылаетесь на столбец родительского запроса в подзапросе? Вот мой запрос# 1054 - Неизвестный столбец 'XXXX' в 'where clause'

SELECT 
    c.username, c.staff_of, CONCAT(c.first_name, ' ', c.middle_name, ' ', c.last_name) AS csr, 
    d.date, d.account, d.total_transaction, d.total_participate, d.total_amount, 
    (SELECT COUNT(id) FROM users WHERE created_by = c.username) AS total_agents 
FROM `users` c, 
    (SELECT 
      DATE(res_date) AS date, B.res_account AS account, 
      COUNT(B.res_id) AS total_transaction, 
      COUNT(DISTINCT(B.res_account)) AS total_participate, 
      SUM(B.res_amount) AS total_amount 
    FROM 
      merchant_responses B 
    WHERE B.res_account IN (SELECT t.staff_of FROM users t WHERE t.created_by = c.username) 
    ) AS d 
WHERE c.account_type ='DSO' GROUP BY c.username 

и это результат я получаю

#1054 - Unknown column 'c.username' in 'where clause' 

Как сделать видимыми c.username в подзапрос?

Thanx заранее

+6

mate, использование JOIN, пожалуйста. theres нет необходимости во всех этих подпросах. неэффективен и проблематичен – ldgorman

+0

Существует также условие объединения между производной таблицей '' d ''и' users'. Это создаст декартовое соединение. Кроме того, использование агрегатов внутри производной таблицы является незаконным в стандартном SQL. MySQL wil позволяет вам уйти с ним, хотя - но он вернет случайные значения: http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html –

ответ

2

почему использование подтаблицы? вы используете агрегатную функцию SUM, но нет группы по утверждению, я думаю, вы можете написать это как то

SELECT c.username, 
      c.staff_of, 
      CONCAT(c.first_name, ' ', c.middle_name, ' ', c.last_name) AS csr, 
      DATE(B.res_date) AS date, 
      B.res_account AS account, 
      COUNT(B.res_id) AS total_transaction, 
      COUNT(DISTINCT(B.res_account)) AS total_participate, 
      SUM(B.res_amount) AS total_amount, 
      (SELECT COUNT(id) FROM users WHERE created_by = c.username) AS total_agents 
    FROM `users` c, merchant_responses B 
    WHERE B.res_account IN (SELECT t.staff_of FROM users t WHERE t.created_by = c.username) 
    AND c.account_type ='DSO' 
    GROUP BY c.username 

соединение между С и В отсутствуют, я не могу добавить его, потому что я не знаю ключи

+2

Правильно отформатируйте запрос. Это беспорядок для чтения. –

+0

Эта работа в значительной степени является результатом, который я хочу, возможно ли также получить все записи, которые не существуют в таблицах merchant_responses? –

+0

@samdev Я не понимаю ваш запрос – Nagasaki

3

Это не подзапрос это является производной таблицы.

SELECT 
    c.username, c.staff_of, CONCAT(c.first_name, ' ', c.middle_name, ' ', c.last_name) AS csr, 
    d.date, d.account, d.total_transaction, d.total_participate, d.total_amount, 
    (SELECT COUNT(id) FROM users WHERE created_by = c.username) AS total_agents 
FROM `users` c, 
    (SELECT 
      DATE(res_date) AS date, B.res_account AS account, 
      COUNT(B.res_id) AS total_transaction, 
      COUNT(DISTINCT(B.res_account)) AS total_participate, 
      SUM(B.res_amount) AS total_amount 
    FROM 
      merchant_responses B 
    WHERE B.res_account IN (SELECT t.staff_of FROM users t) 
    ) AS d 
WHERE c.account_type ='DSO' AND d.account = c.staff_of GROUP BY c.username 

Обновленный Обновленный запрос

+1

Правильное имя - это «* производная» таблица ", а не" temp table ". –

+0

@a_horse_with_no_name - обновленный – ysrb

+0

, также известный как _inline view_ – ninesided