Назначение псевдонима должно быть после закрывающей части подзапроса в списке SELECT
SELECT ...
, ( SELECT ... AS foo FROM ... WHERE ... ) AS col_name
-- ^^^^^^^^^^^
FROM
Псевдоним foo
, назначенный внутри подзапроса, не имеет значения для внешнегозапрос.Для внешнего запроса важен псевдоним, назначенный выражению в списке SELECT внешнего запроса, col_name
.
(Мы можем запустить запрос в клиенте командной строки mysql и увидеть присвоенный емустолбец в наборе результатов. Или в коде PHP, мы можем проверить / vardump массив, возвращаемый из выборки.)
Некоторые другие проблемы выглядят как полекартово произведение, несколько строк возвращаются из нескольких дочерних элементов.таблицы крест соединены вместе.Кажется, что некоторые условия соединения отсутствуют.
Я рекомендую исключить синтаксис запятой старой школы для операции соединения и вместо этого использовать ключевое слово JOIN
.
FOLLOWUP
Предложение выше (назначение псевдонима выражению подзапроса в списке SELECT внешнего запроса, может «работать», но я думаю, что с запросом значительно больше ошибок.
С коррелированными подзапросами в списке SELECT, я не думаю, что необходимо выполнять соединения с band
и present
во внешнем запросе. Это приведет к неожиданным результатам, когда несколько строк возвращаются и перекрестно соединяются.соответствующая строка не возвращается из band
или present
, строка будет отсутствовать в наборе результатов.
Это выглядит мне (и я просто догадываюсь, потому что у нас нет спецификации длячто должен вернуть запрос) ...
Мне кажется, что цель состоит в том, чтобы вернуть результат, эквивалентный результату, возвращенному запросом этого шаблона:
SELECT l.location_name
, e.emp_name
, ( SELECT COUNT(pd.present_date) AS present_days
FROM present pd
WHERE pd.emp_id = e.emp_id
AND pd.present_status = '?'
AND pd.present_date BETWEEN '$date1' AND '$date2'
) AS present_days
, ( SELECT COUNT(ad.present_status)
FROM `present` ad
WHERE ad.emp_id = e.emp_id
AND ad.present_status = '?'
AND ad.present_date BETWEEN '$date1' AND '$date2'
) AS absent_days
, ( SELECT COUNT(pa.present_status)
FROM `present` pa
WHERE pa.emp_id = e.emp_id
AND pa.present_status = '??'
AND pa.present_date BETWEEN '$date1' AND '$date2'
) AS permission_absent_days
, ( SELECT MAX(tr.band_name)
FROM `band` tr
WHERE tr.emp_id = e.emp_id
AND tr.band_name = 'NoTraining'
AND tr.band_date BETWEEN '$date1' AND '$date2'
) AS training
, ( SELECT COUNT(eb.band_name)
FROM `band` eb
WHERE eb.emp_id = e.emp_id
AND eb.band_date BETWEEN '$date1' AND '$date2'
) AS employers_band
FROM `employers` e
JOIN `location` l
ON l.location_id = e.location_id
ORDER
BY e.emp_name ASC