2017-02-22 29 views
0

У меня есть таблица, которая содержит «работу» для данного «проекта», и я хотел бы получить следующую строку из таблицы для каждого проекта.MySQL GROUP BY следующая строка в таблице для ограничения внешнего ключа

TABLE project { id, name } 
TABLE work {id, project_id, value, done} 

Каков правильный, эффективный запрос для получения новой работы по одному, пока все не будет выполнено? Следующий запрос не работает и замена столбцов выбора min(columnhere) приводит к неверным совпадениям результатов из нескольких строк.

SELECT w.id, p.name, w.value FROM work w 
LEFT JOIN project p ON p.id = w.project_id 
GROUP BY project_id 

Результаты вышеупомянутого запроса должны выглядеть следующим образом:

34, "Project 1", "Work 43", "..." 
21, "Project 2", "Work 10", "..." 
321, "Project 3", "Work 86", "..." 
+0

ли это тот же вопрос? – GurV

+0

Отправьте желаемую таблицу результатов. – r0xette

ответ

1

Если я правильно читать ваш вопрос и вам нужно (пока еще не сделано) работать в то время, для каждого проекта, то есть ищу что-то вроде этого

SELECT n.id, n.project_id, p.name project, w.value work 
    FROM 
(
    SELECT project_id, MIN(id) id 
    FROM work 
    WHERE done = 0 
    GROUP BY project_id 
) n JOIN work w 
    ON n.id = w.id JOIN project p 
    ON n.project_id = p.id 

Пояснения:

  1. захватить самый первый идентификатор работы, которая еще не выполнена для каждого проекта. Предполагается, что работа упорядочена по id.
  2. присоединиться обратно к work, чтобы получить все другие ценности работы на основе идентификатора
  3. присоединиться к projects, чтобы получить имена проектов вывода Пример:
 
+------+------------+-----------+---------+ 
| id | project_id | project | work | 
+------+------------+-----------+---------+ 
| 43 |   34 | Project 1 | Work 43 | 
| 10 |   21 | Project 2 | Work 10 | 
| 86 |  321 | Project 3 | Work 86 | 
+------+------------+-----------+---------+ 
+0

Ницца. Запрос работает, но медленный, если вы не добавите индекс в оба столбца в подзапросе: 'index (done, project_id)'. Даже тогда MySQL по-прежнему приходится сортировать почти все строки в таблице. – Xeoncross

+0

Несомненно. Само собой разумеется, что вам нужны соответствующие индексы. – peterm

+0

Тогда, если кто-то может определить соответствующие индексы, пожалуйста, сообщите нам об этом. – Xeoncross

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

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