2016-09-01 3 views
2

Мне нужно отобразить список встреч между двумя кандидатами, в которых я должен отображать дату, время последней встречи между двумя кандидатами вместе со счетом всех собраний, которые были организованы между ними.Выберите последнюю строку со счетом всех записей для пары значений

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

SELECT cm.id AS meeting_id, cm.meeting_date, cm.meeting_time, cm.candidate1_id, cm.candidate2_id 
      FROM candidate_meetings AS cm         
      JOIN view_candidate_details AS candidate_1 ON candidate_1.id = cm.candidate1_candidate_id 
      JOIN view_candidate_details AS candidate_2 ON candidate_2.id = cm.candidate2_candidate_id 
      WHERE (candidate_1.counselor_member_id = 41 OR candidate_2.counselor_member_id = 41) 
      ORDER BY cm.id DESC 

, который дает следующие ouptput:

+------------+--------------+--------------+------------------+-----------------+ 
| meeting_id | meeting_date | meeting_time | candidate1_id | candidate2_id | 
+------------+--------------+--------------+------------------+-----------------+ 
|   6 | 2016-08-31 | 17:45:00  |    24 |    28 | 
|   5 | 2016-08-31 | 17:30:00  |    24 |    28 | 
|   4 | 2016-08-31 | 19:30:00  |    24 |    23 | 
|   3 | 2016-08-31 | 18:30:00  |    24 |    22 | 
|   2 | 2016-08-31 | 19:15:00  |    24 |    21 | 
|   1 | 2016-08-31 | 17:15:00  |    24 |    21 | 
+------------+--------------+--------------+------------------+-----------------+ 

Теперь, чтобы получить количество наряду с подробной информацией о самой последней встречи двух кандидат, я добавляю это к запросу:

SELECT *, count(*) AS meeting_count         
     FROM                 
     (                 
      SELECT cm.id AS meeting_id, cm.meeting_date, cm.meeting_time, cm.candidate1_id, cm.candidate2_id 
      FROM candidate_meetings AS cm         
      JOIN view_candidate_details AS candidate_1 ON candidate_1.id = cm.candidate1_candidate_id 
      JOIN view_candidate_details AS candidate_2 ON candidate_2.id = cm.candidate2_candidate_id 
      WHERE (candidate_1.counselor_member_id = 41 OR candidate_2.counselor_member_id = 41) 
      ORDER BY cm.id DESC    
     ) as sub                
     GROUP BY sub.candidate1_id, sub.candidate2_id; 

После запуска этого qu чень Я получаю этот результат:

+------------+--------------+--------------+------------------+-----------------+---------------+ 
| meeting_id | meeting_date | meeting_time | candidate1_id | candidate2_id | meeting_count | 
+------------+--------------+--------------+------------------+-----------------+---------------+ 
|   1 | 2016-08-31 | 17:15:00  |    24 |    21 |    2 | 
|   3 | 2016-08-31 | 18:30:00  |    24 |    22 |    1 | 
|   4 | 2016-08-31 | 19:30:00  |    24 |    23 |    1 | 
|   5 | 2016-08-31 | 17:30:00  |    24 |    28 |    2 | 
+------------+--------------+--------------+------------------+-----------------+---------------+ 

Но ожидаемый результат

+------------+--------------+--------------+------------------+-----------------+---------------+ 
| meeting_id | meeting_date | meeting_time | candidate1_id | candidate2_id |meeting_count | 
+------------+--------------+--------------+------------------+-----------------+---------------+ 
|   6 | 2016-08-31 | 17:45:00  |    24 |    28 |    2 | 
|   4 | 2016-08-31 | 19:30:00  |    24 |    23 |    1 | 
|   3 | 2016-08-31 | 18:30:00  |    24 |    22 |    1 | 
|   2 | 2016-08-31 | 19:15:00  |    24 |    21 |    2 | 
+------------+--------------+--------------+------------------+-----------------+---------------+ 

PS: Пожалуйста, игнорируйте порядок столбца идентификаторов в ожидаемом результате.

ответ

1

Причина разницы между фактическими выходами и ожидаемыми выходами заключается в том, что вы не говорите MySQL, что хотите получить последнюю дату собрания. Ваш запрос противоречит стандарту sql, потому что у вас есть поля в списке выбора, которые не входят ни в группу по списку, ни под агрегированную функцию, такую ​​как max().

MySQL при определенных настройках режима sql позволяет запускать такие запросы, однако value of such fields is indeterminate.

Лучшее решение явно указать MySQL, что вам нужно:

SELECT max(concat(cm.meeting_date, cm.meeting_time)) as latest_meeting_time, cm.candidate1_id, cm.candidate2_id 
     FROM candidate_meetings AS cm         
     JOIN view_candidate_details AS candidate_1 ON candidate_1.id = cm.candidate1_candidate_id 
     JOIN view_candidate_details AS candidate_2 ON candidate_2.id = cm.candidate2_candidate_id 
     WHERE (candidate_1.counselor_member_id = 41 OR candidate_2.counselor_member_id = 41) 
     GROUP BY cm.candidate1_id, cm.candidate2_id 

Если вы хотите дополнительные значения полей из candidate_meetings таблицы из аписывает последних встреч, затем поместите выше запрос в подзапрос и присоединиться он возвращается к вашей таблице candidate_meetings во внешнем запросе в условии соединения concat(candidate_meetings.meeting_date, candidate_meetings.meeting_time)=subquery_alias.latest_meeting_time.

+0

Спасибо за то, что вы указали правильный путь, а также +1 для предоставления знаний о стандартах sql. – Parth

-1

Попробуйте это:

SELECT *, count(*) AS meeting_count         
FROM                  
    (SELECT cm.id AS meeting_id, cm.meeting_date, cm.meeting_time, cm.candidate1_id, cm.candidate2_id 
    FROM candidate_meetings AS cm         
    JOIN view_candidate_details AS candidate_1 ON candidate_1.id = cm.candidate1_candidate_id 
    JOIN view_candidate_details AS candidate_2 ON candidate_2.id = cm.candidate2_candidate_id 
    WHERE (candidate_1.counselor_member_id = 41 OR candidate_2.counselor_member_id = 41) 
    ORDER BY cm.id    
) as sub                
GROUP BY sub.candidate1_id, sub.candidate2_id 
ORDER BY cm.id DESC 

Вы получаете ваш ожидаемый результат неправильно, потому что при использовании предложения GROUP BY, база данных выберите последнее вхождение MEETING_ID, meeting_date, meeting_time.

+0

Это «решение» соответствует стандартам sql и будет работать только в определенных настройках режима sql только в mysql. В последних версиях MySQL настройки по умолчанию предотвратят запуск таких запросов. – Shadow

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