СУММА таблицы A с LEFT JOIN tableB также учитывает всю таблицу B - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть таблица A

Table A data

и связанная таблица B

Table B data

, к которому присоединен уникальный идентификатор в таблице A Я хочу подсчитать строки в таблице A, а также подсчитать строки в таблице A, где есть связанная таблица B

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

SELECT NameID,Area,Area !="" AS Kount, 
b.tableaID > 0 AS `Visted`
FROM `tablea` a 
LEFT OUTER JOIN tableb b ON a.ID=b.tableaID 
GROUP BY a.ID,b.tableaID,Area

Это дает мне список NameID и областей, каждая из которых показывает один раз, но, очевидно, только 1 в Kount и Visited.

First Result

Как только я добавлю сумму на Kount, например.

SELECT NameID,Area,SUM(Area !="") AS Kount, 
SUM(b.tableaID > 0) AS `Visted`
FROM `tablea` a 
LEFT OUTER JOIN tableb b ON a.ID=b.tableaID 
GROUP BY a.ID,b.tableaID,Area

Я получу счетчик всей таблицы 'B', даже если у меня есть группы на месте , Second sql

Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 07 февраля 2020

Я бы начал с предварительного запроса tableB, сгруппированного по столбцу tableA ID. Теперь go вернемся к исходной таблице A и перейдем с LEFT-JOIN к tableB.

select
      A.*,
      coalesce( BQry.bRecs, 0 ) as NumBRecords
   from
      tableA A
         LEFT JOIN
         ( select
                    tableaID,
                    count(*) bRecs
                from
                    tableB
                group by
                    tableaID ) BQry
        on A.id = BQry.tableaID

Теперь сторона таблицы "A" имеет идентификатор, который, как я подозреваю, является первичным ключом и никогда не будет иметь любые дубликаты "ID" в этой таблице. Таким образом, группировка внутренней таблицы «BQry» по этому идентификатору является основой объединения, как и ваше левое соединение. Сторона «А» всегда будет равна 1, поскольку это основа записи запроса.

Coalesce () для записей BQry будет равен 0, если такого совпадения для tableAID нет, и фактическим числом, если таковое найдено.

И в будущем не пытайтесь расширять ответ в комментарии ... Просто отредактируйте свой существующий пост и добавьте к нему дополнительную информацию.

ПЕРЕСМОТР

После повторного просмотра я обнаружил, что вы не определяете внешнюю сумму на tableA ID, но имя в TableID. Несколько табличных идентификаторов могут иметь одинаковые ссылки на имена.

select
      A.NameID,
      A.Area,
      count(*) as NameCounts,
      sum( coalesce( BQry.bRecs, 0 )) as NumBRecords
   from
      tableA A
         LEFT JOIN
         ( select
                    tableaID,
                    count(*) bRecs
                from
                    tableB
                group by
                    tableaID ) BQry
        on A.id = BQry.tableaID

группа по A.NameID, A.Area

...