почему считать (*) как имя, показывающее неопределенный индекс: имя - PullRequest
0 голосов
/ 28 марта 2019

при извлечении данных из базы данных php говорит неопределенный индекс для этой строки, который считается count (*) как имя, имя которого не определено

SELECT location.location_name,
       employers.emp_name,
       (SELECT COUNT(present.present_date) AS present_days
        from present
        WHERE present_status='م' AND present.emp_id=employers.emp_id AND present.present_date between '$date1' AND '$date2') ,
       (SELECT COUNT(present.present_status) AS absent_days 
        from present
        WHERE present_status='غ' AND present.emp_id=employers.emp_id AND present.present_date between '$date1' AND '$date2'), 
       (SELECT COUNT(present.present_status) AS permission_absent_days
        from present
        WHERE present_status='غب' AND present.emp_id=employers.emp_id AND present.present_date between '$date1' AND '$date2'),
       (SELECT band.band_name AS training
        from band
        WHERE band_name='NoTraining' AND band.emp_id=employers.emp_id AND band.band_date between '$date1' AND '$date2'),
       (SELECT COUNT(band.band_name)AS employers_band
        from band
        WHERE band.emp_id=employers.emp_id AND band.band_date between '$date1' AND '$date2') 
FROM `present`, `employers`,`location`,`band`
WHERE  present.emp_id = employers.emp_id AND location.location_id = employers.location_id 
GROUP BY employers.emp_name 
ORDER BY employers.emp_name ASC

1 Ответ

1 голос
/ 28 марта 2019

Назначение псевдонима должно быть после закрывающей части подзапроса в списке 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...