Объединение с подзапросами, подсчет и группировка - PullRequest
0 голосов
/ 16 сентября 2009

У меня есть три таблицы, каждая из которых 1: n. Запись в таблице1 имеет n записей в таблице2 и так далее. Давайте назовем их автомобилями, колесами и винтами для иллюстрации. Винты могут быть чистыми (1) или ржавыми (2). Я соединяю их вместе, потому что хочу сосчитать две вещи. Во-первых, я хочу, чтобы ряды сообщали мне, сколько хороших / плохих винтов на колесо у меня есть для каждой машины. Так что в основном я получаю:

car_id    wheel_id   screw_state  count(screws)
   1          1           1          3
   1          1           2          7
   1          2           1          5
   1          2           2          3
   2          1           1          1
                ... and so on...

Теперь мне нужен второй факт, а именно, сколько ржавых и чистых винтов у меня есть для всех колес на автомобиль, без необходимости знать каждое конкретное число на колесо. Так что теперь я просто оставляю GROUP BY над wheel_id, вот так:

car_id    screw_state  count(screws)
   1          1             8
   1          2            10
   2          1             1
                ... and so on...

Дело в том, что мне нужно было бы их обоих в одном запросе, потому что в противном случае мне нужно было бы много сортировать и переупорядочивать.

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

Как это сделать?

Я был бы рад получить довольно конкретные ответы, потому что я на самом деле не волшебник SQL.

edit : Я работаю над ORM, поэтому в стиле фанк, как показано ниже (взлом значений col для некоторой константы), не может быть там легко реализован. Я должен заставить это решение работать там, так что JOIN / subquery / UNIONs без прикольных обходных путей были бы хороши.

Ответы [ 2 ]

1 голос
/ 17 сентября 2009

Быстрый поиск говорит о том, что MySQL поддерживает GROUPING SETS. Это хороший кандидат на эту функцию:

SELECT car_id, wheel_id, screw_state, count(screws)
FROM cars C
JOIN wheels W ON W.car_id = C.car_id
JOIN screws S ON S.wheel_id = W.wheel_id
GROUP BY GROUPING SETS (
  (car_id, screw_state, wheel_id),
  (car_id, screw_state)
)
ORDER BY car_id, wheel_id, screw_state
1 голос
/ 16 сентября 2009
SELECT car_id, wheel_id, screw_state, count(screws)
  FROM cars C, wheels W, screws S
 WHERE W.car_id = C.car_id
   AND S.wheel_id = W.wheel_id
 GROUP BY car_id, wheel_id, screw_state
UNION ALL
SELECT car_id, -1 AS wheel_id, screw_state, count(screws)
  FROM cars C, wheels W, screws S
 WHERE W.car_id = C.car_id
   AND S.wheel_id = W.wheel_id
 GROUP BY car_id, screw_state
ORDER BY car_id

вы можете UNION 2 запроса, второй для всех колес на машину, поэтому wheel_id = -1.

результат:

    car_id    wheel_id   screw_state  count(screws)
       1          1           1          3
       1          1           2          7
       1          2           1          5
       1          2           2          3
       1         -1           1          8
       1         -1           2         10
       2          1           1          1
       2         -1           1          1
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...