Проблемы с подсчетом соединенных строк с условным - PullRequest
0 голосов
/ 10 сентября 2009

У меня возникли некоторые проблемы с MySQL и при выборе числа столбцов из объединенной таблицы. У меня такое чувство, что для получения строк, к которым я хотел бы присоединиться, мне потребуется оператор sub-select вместо того, чтобы делать это в моем основном, где это условно.

Я пытаюсь выбрать список проектов, которые связаны с определенным пользователем. Я также хотел бы включить количество задач, которые назначены этому проекту и этому пользователю (но только те, которые имеют определенный статус).

У меня это работает почти - это значит, совсем нет. Он будет возвращать только идентификатор проекта 1, а не идентификатор 2. Это из-за моего условия «tasks.status <9» where. </p>

Любая помощь будет великолепна. Дайте мне знать, если мне нужно что-то объяснить.

+-------------------------+
| projects_to_users       |
+-----------+-------------+
+ user_id   | project_id  |
+-----------+-------------+
+ 1         | 1           |
+-----------+-------------+
+ 1         | 2           |
+-----------+-------------+


+-------------------------+
| projects                |
+--------------+----------+
+ project_id   | name     |
+--------------+----------+
+ 1            | Foo      |
+--------------+----------+
+ 2            | Bar      |
+--------------+----------+

+------------------------------------------------+
| tasks                                          |
+-----------+--------------+----------+----------+
+ task_id   | project_id   | status   | name     |
+-----------+--------------+----------+----------+
+ 1         | 1            | 1        | Do it    |
+-----------+--------------+----------+----------+
+ 2         | 1            | 1        | Do itt   |
+-----------+--------------+----------+----------+
+ 3         | 1            | 9        | Do not   |
+-----------+--------------+----------+----------+



SELECT count( tasks.task_id ) AS task_count, projects.*
FROM (projects)
LEFT JOIN tasks ON tasks.project_id = projects.project_id
LEFT JOIN projects_to_users ON projects.project_id=projects_to_users.project_id
WHERE tasks.status<9
AND tasks.assigned_user_id = '1'
AND projects_to_users.user_id = '1'
GROUP BY projects.project_id


RETURNS:

+--------------+--------------+--------+
+ task_count   | project_id   | name   |
+--------------+--------------+--------+
+ 2            | 1            | Foo    |
+--------------+--------------+--------+

SHOULD RETURN:

+--------------+--------------+--------+
+ task_count   | project_id   | name   |
+--------------+--------------+--------+
+ 2            | 1            | Foo    |
+--------------+--------------+--------+
+ 0            | 2            | Bar    |
+--------------+--------------+--------+

Ответы [ 2 ]

2 голосов
/ 10 сентября 2009

Если вы хотите показать количество задач для каждого проекта, для каждого пользователя, вам также следует сгруппировать данные по полю projects_to_users.user_id.

Кроме того, причина, по которой вы не видите проект с нулевым счетом, заключается в том, что ваше условие WHERE ожидает совпадения с помощью предложений LEFT JOIN. Если вы переместите критерии WHERE в сами соединения, это будет работать лучше для вас.

Например:

SELECT count( tasks.task_id ) AS task_count, 
       projects.*
FROM (projects)
LEFT JOIN tasks ON tasks.project_id = projects.project_id AND tasks.status < 9 AND tasks.assigned_user_id = '1'
LEFT JOIN projects_to_users ON projects.project_id=projects_to_users.project_id AND projects_to_users.user_id = '1'
GROUP BY projects.project_id
0 голосов
/ 10 сентября 2009

Почему вы не можете сделать простое соединение, как это:

select count(*) from projects_to_users inner join tasks on projects_to_users.project_id=tasks.project_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...