Объединение двух таблиц и возврат данных и подсчета в одном запросе

#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 . . . Это отвечает на вопрос, который вы задали здесь. Задайте новый вопрос, если вы не задали именно тот вопрос, который намеревались задать. На этот вопрос дан ответ.