2015-07-20 6 views
1

Я работал с этой проблемой с помощью PHP, но я знаю, что это будет быстрее, если я могу сделать для нее один запрос. У меня есть следующие 2 таблицы.Выбор первой записи только из таблицы соединений с условием where

projects:  
+------------+--------------+ 
| project_id | project_name | 
+------------+--------------+ 
| 1   | a   | 
| 2   | b   | 
| 3   | c   | 
| 4   | d   | 
+------------+--------------+ 

tasks: 
+------------+------------+-------------+---------------------+ 
| project_id | task_id | task_status | task_due_timestamp | 
+------------+------------+-------------+---------------------+ 
|  1  |  1  |  1  | 2015-01-01 12:00:00 | 
|  1  |  2  |  2  | 2015-01-02 12:00:00 | 
|  2  |  3  |  3  | 2015-01-03 12:00:00 | 
|  3  |  4  |  1  | 2015-01-04 12:00:00 | 
+------------+------------+-------------+---------------------+ 

Мне нужен запрос, который будет выбрать ВСЕ проекты со связанной с ними задачей, имеющей статус 1 или 2. И задача выбирает должна быть самым последним. См. Таблицу ниже.

records after query: 
+------------+--------------+------------+-------------+---------------------+ 
| project_id | project_name | task_id | task_status | task_due_timestamp | 
+------------+--------------+------------+-------------+---------------------+ 
|  1  | a   |  1  |  1  | 2015-01-01 12:00:00 | 
|  2  | b   |  null | null  |  null   | 
|  3  | c   |  3  |  3  | 2015-01-01 12:00:00 | 
|  4  | d   |  null |  null | null    | 
+------------+--------------+------------+-------------+---------------------+ 

Как видите, проект 2 не должен иметь задачу, так как состояние задачи равно 2. И проект 4 не имеет проектов. В проекте 1 есть 2 задачи, но самый ранний - за один день.

Любая помощь была бы принята с благодарностью.

+0

как вы получаете 2015-01-01 12:00:00 запись вместо 2015-01-02 12:00:00? – HaveNoDisplayName

+0

Вы должны использовать оператор MAX для получения самой последней задачи, а затем присоединиться к объединению задач с проектами. Используйте WHERE для выбора статуса 1 ИЛИ 2 – Darkwing

ответ

-3

Вы можете попробовать это: -

SELECT P.project_id, P.project_name, T.task_id, T.task_status, MIN(T.task_due_timestamp) 
FROM projects P INNER JOIN tasks T 
ON P.project_id = T.project_id 
AND T.task_status IN (1,2) 
GROUP BY P.project_id, P.project_name, T.task_id, T.task_status 
+0

'MIN (T.task_id), MIN (T.task_status), MIN (T.task_due_timestamp)' может выбрать 3 поля, которые не находятся в одной строке. – Shoe

+0

Принято. Я не читал вопросы полностью. Я отредактировал мой ответ –

+0

Вы протестировали этот запрос? – HaveNoDisplayName

0

Вы можете попробовать с левой присоединиться на самых последних задач со статусом 1 или 2. Запрос хотел бы что-то вроде этого:

select p.*, t.* 
from projects as p 
    left join (
    select t1.* 
    from tasks as t1 
    where t1.task_status in (1, 2) 
     and not exists (
     select task_id from tasks as t2 
     where t1.task_id <> t2.task_id 
      and t1.project_id = t2.project_id 
      and t2.task_status in (1, 2) 
      and t2.task_due_timestamp > t1.task_due_timestamp 
    ) 
) as t on p.project_id = t.project_id 

Live demo

 Смежные вопросы

  • Нет связанных вопросов^_^