У меня есть две таблицы mysql:
Первая таблица table1:
| ID | NAME |
| 1 | cat |
| 2 | mouse |
| 3 | mouse |
| 4 | mouse |
| 5 | mouse |
| 6 | mouse |
Таблица привязок table2:
| ID | NAME_NA |
| 1 | cat |
| 2 | mouse |
| 3 | cd_rom |
| 4 | dvd_rw |
| 5 | house |
И я хочу вывести это:
mouse - 5 entries
cat - 1 entry
cd_rom - 0 entries
dvd_rw - 0 entries
house - 0 entries
SELECT x.name_na AS name,
COALESCE(COUNT(y.name), 0) AS num_entries
FROM TABLE2 x
LEFT JOIN TABLE1 y ON y.name = x.name_na
... получить:
name num_entries
--------------------
mouse 5
cat 1
cd_rom 0
dvd_rw 0
house 0
SELECT `table1`.`NAME`, IFNULL(COUNT(*), 0) as entries FROM
`table2` LEFT JOIN `table1` ON `table1`.`NAME` = `table2`.`NAME_NA`
GROUP BY `table1`.`NAME`;
LEFT JOIN
создает строки для каждого элемента в левой таблице (table2
здесь), даже если в table1
нет совпадения, а также будет создавать несколько строк для элемента в table2
, если есть несколько совпадающих строк в table1
для этого элемента.
Затем, если вы GROUP BY
имя и используете функцию COUNT()
, вы можете получить количество совпадений каждого элемента в table2
в table1
.
Используется IFNULL()
, потому что COUNT()
возвращает NULL
, если не было совпадений для этого элемента в table1
, поэтому вместо этого мы заменяем на 0
.