Подсчет и соединения - PullRequest
       3

Подсчет и соединения

0 голосов
/ 20 октября 2011

У меня такой запрос:

SELECT c.id, c.name, f.name
FROM companies c
INNER JOIN facilities f ON c.id = f.company
ORDER BY c.name DESC, f.name

Я также хочу получить COUNT() всех work_orders (таблица), которые равны approved (столбец, содержащий 0 или 1) для каждой строки (каждого объекта).

например, SELECT COUNT(*) FROM work_orders w WHERE w.facility = f.id AND w.approved = 1

Результат должен выглядеть как

company | facility | count
--------------------------
goog    | ohio     | 2
goog    | cali     | 0
tekk    | cupertin | 0

В качестве продолжения я также хотел бы добавить еще один столбец подсчета, где w.approved = 0

Ответы [ 2 ]

2 голосов
/ 20 октября 2011
SELECT c.id, c.name, f.name, COUNT(w.id) AS work_orders
FROM companies c
INNER JOIN facilities f ON c.id = f.company
-- LEFT JOIN used in case there are facilities with no work orders
LEFT JOIN work_orders w ON f.id = w.facility AND w.approved = 1
GROUP BY c.id, c.name, f.name
ORDER BY c.name DESC, f.name

Чтобы сделать несколько подсчетов (утверждено или нет):

SELECT c.id, c.name, f.name, 
  wapp.wo AS approved_work_orders,
  wnapp.wo AS non_approved_work_orders,
FROM companies c
INNER JOIN facilities f ON c.id = f.company
LEFT JOIN (SELECT facility, COUNT(*) AS wo FROM work_orders WHERE approved=1 GROUP BY facility) wapp ON f.id = wapp.facility
LEFT JOIN (SELECT facility, COUNT(*) AS wo FROM work_orders WHERE approved=0 GROUP BY facility) wnapp ON f.id = wnapp.facility
ORDER BY c.name DESC, f.name
0 голосов
/ 20 октября 2011

Похоже, вам просто нужна группировка по c.id и инструкция if

SELECT c.id, c.name, f.name, IF(count(0)>0,1,0) 
FROM companies c
INNER JOIN facilities f ON c.id = f.company
LEFT JOIN work_orders w ON w.facility = f.id
GROUP BY f.id
ORDER BY c.name DESC, f.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...