#mysql #sql
#mysql #sql
Вопрос:
Ссылка sqlfiddle
У меня есть эти таблицы :
CREATE TABLE IF NOT EXISTS `project` (
`project_id` int(6) unsigned NOT NULL,
`id_location` varchar (50) not null,
PRIMARY KEY (`project_id`))DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `location` (
`location_id` int(6) unsigned NOT NULL,
`parent_id` varchar (50) not null,
PRIMARY KEY (`location_id`))DEFAULT CHARSET=utf8;
INSERT INTO `project` (`project_id`, `id_location`) VALUES
('1', '4'),
('2', '4'),
('3', '4'),
('4', '5'),
('5', '5'),
('6', '6'),
('7', '7');
INSERT INTO `location` (`location_id`, `parent_id`) VALUES
('2', '1'),
('3', '1'),
('4', '2'),
('5', '2'),
('6', '3'),
('7', '3');
Я использую этот запрос для получения следующего результата:
SELECT project.project_id
, project.id_location
, location.parent_id
FROM project
LEFT
JOIN location
ON project.id_location = location.id
| project_id | id_location | parent_id |
| 1 | 4 | 2 |
| 2 | 4 | 2 |
| 3 | 4 | 2 |
| 4 | 5 | 2 |
| 5 | 5 | 2 |
| 6 | 6 | 3 |
| 7 | 7 | 3 |
Я хочу получить список parent_id вместе с подсчетом project_id . Я буду использовать после условия, подобного where parent_id = x
|parent_id | countofproject_id
| 2 | 5
| 3 | 2
Комментарии:
1. Предоставленная ссылка sqlfiddle
2. Пожалуйста, покажите нам результат, который вы хотите, в виде табличного текста.
3. Как будет выглядеть желаемый результат? Пожалуйста, отредактируйте свой вопрос соответствующим образом.
4. вы можете использовать внутреннее объединение между двумя таблицами и группировать по parent_id
Ответ №1:
Это похоже на агрегацию:
SELECT l.parent_id, COUNT(*)
FROM project p LEFT JOIN
location l
ON p.id_location = l.id
GROUP BY l.parent_id;
Неясно, почему вы используете LEFT JOIN
здесь. Агрегирование по столбцу во второй таблице — плохая практика. Итак, вы можете просто захотеть INNER JOIN
.
Если вам нужны все родительские идентификаторы, измените таблицы местами:
SELECT l.parent_id, COUNT(p.id_location)
FROM location l LEFT JOIN
project p
ON p.id_location = l.id
GROUP BY l.parent_id;
Комментарии:
1. Спасибо. Ваше решение работает для моего первоначального запроса. Я также хотел бы сейчас пойти дальше, и я хотел бы достичь чего-то вроде этого:<br/>
"SELECT l.*, (SELECT l.parent_id, COUNT(*) FROM project p INNER JOIN location l ON p.id_location = l.id GROUP BY l.parent_id) AS counted ". "FROM location l ". "WHERE l.parent_id = 2 AND l.published=1 ". "ORDER BY thecount desc ";
2. @Catalin . . . Это отвечает на вопрос, который вы задали здесь. Задайте новый вопрос, если вы не задали именно тот вопрос, который намеревались задать. На этот вопрос дан ответ.