2009-09-10 3 views
0

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

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

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

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

+-------------------------+ 
| 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

Если вы хотите показать для каждого проекта, для каждого пользователя подсчет задачи, вы должны также группу по 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

Бинго, спасибо человеку. –

0

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

select count(*) from projects_to_users inner join tasks on projects_to_users.project_id=tasks.project_id; 
Смежные вопросы