MySQL счетчик не возвращает ноль - PullRequest
0 голосов
/ 10 июня 2011

У меня есть этот запрос:

SELECT COUNT( tbl_workstation.workstation_id ) AS AVAILABLE, tbl_lab.room_no,
tbl_lab.capacity
FROM tbl_workstation, tbl_lab
WHERE tbl_workstation.logged_on =0
AND tbl_workstation.startup =1
AND tbl_workstation.lab_name = tbl_lab.lab_name
GROUP BY tbl_lab.lab_name

Я получаю правильные подсчеты для каждой из лабораторий - однако, где отсчет равен 0 - ничего не возвращается. Мне нужно вернуть строки, где счетчик также равен нулю. Я смотрел на левое соединение, но я получаю всевозможные ошибки. Что-нибудь от неправильных наборов результатов до неоднозначных ошибок столбца. Что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 10 июня 2011

Если вы хотите получить все лабораторные работы, даже те, которые имеют 0 рабочих станций, используйте таблицу лабораторных работ в качестве основной таблицы и внешнего соединения с таблицей рабочих станций.

Примерно так должно работать:

SELECT COUNT( tbl_workstation.workstation_id ) AS AVAILABLE, tbl_lab.room_no,
tbl_lab.capacity
FROM tbl_lab
LEFT OUTER JOIN tbl_workstation ON tbl_workstation.logged_on =0 
  AND tbl_workstation.startup =1 
  AND tbl_workstation.lab_name = tbl_lab.lab_name
GROUP BY tbl_lab.lab_name
0 голосов
/ 10 июня 2011

Я бы предложил что-то вроде этого:

SELECT
    tbl_lab.lab_name
    , tbl_lab.room_no
    , tbl_lab.capacity
    , SUM (
            CASE WHEN tbl_workstation.logged_on = 1 OR tbl_workstation.startup = 0 THEN 0 ELSE 1 END
    ) as AVAILABLE
FROM tbl_lab, tbl_workstation
WHERE
    tbl_workstation.lab_name = tbl_lab.lab_name
GROUP BY tbl_lab.lab_name, tbl_lab.room_no, tbl_lab.capacity
ORDER BY tbl_lab.lab_name, tbl_lab.room_no

Я предполагаю, что tbl_workstation.startup означает, что рабочая станция включена и доступна, а рабочие станции, которые не запущены, недоступны.Т.е. рабочая станция не должна входить в систему и должна быть запущена, чтобы быть доступной.

0 голосов
/ 10 июня 2011

Проблема в вашем AND tbl_workstation.lab_name = tbl_lab.lab_name.Этот запрос возвращает результат только в том случае, если в лаборатории есть рабочие станции, поэтому вы не получаете результатов из пустой лаборатории.

И вы правы, вам нужно использовать LEFT JOIN

SELECT COUNT( tbl_workstation.workstation_id ) AS AVAILABLE, tbl_lab.room_no,
tbl_lab.capacity
FROM tbl_workstation
LEFT OUTER JOIN tbl_lab ON bl_workstation.lab_name = tbl_lab.lab_name
WHERE tbl_workstation.logged_on =0
AND tbl_workstation.startup =1
GROUP BY tbl_lab.lab_name

Это должно быть хорошо.

...