Если у вас есть это:
SELECT * FROM table
id, x
1, 'foo'
2, 'foo'
3, 'foo'
SELECT x, COUNT(*) as ct FROM table GROUP BY x
x, ct
'foo', 3
И это "правильно" ..
И тогда вы делаете это:
SELECT x, COUNT(*) as ct FROM table LEFT JOIN sometable ON table.x = sometable.y GROUP BY x
И это внезапно "идет неправильно ":
x, ct
'foo', 7
Это потому, что есть декартово произведение; более одного ряда sometable
соответствует этому ряду. Удалите группировку / поместите выделение * и посмотрите:
SELECT * FROM table LEFT JOIN sometable ON table.id = sometable.otherid --GROUP BY x
id, x, otherid
1, 'foo', 1
1, 'foo', 1
1, 'foo', 1
2, 'foo', 2
2, 'foo', 2
2, 'foo', 2
3, 'foo', null
7 строк, вызвано:
SELECT * FROM othertable
otherid
1
1
1
2
2
2
Более одной строки из othertable
соответствует строке в table
Вам нужно либо ограничить ваше объединение, чтобы оно не вызывало это умножение строк, либо, возможно, сгруппировать соединяющиеся строки в подзапросе перед выполнением объединения
Переключение типа JOIN может также привести к появлению большего количества строк, если вдруг не все строки будут соответствовать друг другу, но это не повлияет на этот случай, когда вы считаете таблицу слева и добавляете другую через левое соединение; только картезианские продукты будут поднимать вещи здесь