2015-01-19 2 views
0

У меня есть следующие влияния таблицы:Использование MAX перемешивает записи вокруг

enter image description here

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

Я следующий запрос, но это смешение данные строки, потому что MAX не возвращает полную запись:

SELECT stakeholder_id, MAX(created_at) AS maxca, influence 
FROM influences 
WHERE 
project_id = 1 AND 
deleted_at IS NULL 
GROUP BY stakeholder_id 

enter image description here

Вы можете видеть, что влияние на эти макки и заинтересованные стороны должно быть 3, а не 5.

Как решить эту проблему? Мое полное существующее заявление было это:

SELECT `stakeholders`.*, `influences`.`influence` 
FROM `project_stakeholder` 
INNER JOIN `stakeholders` ON `project_stakeholder`.`stakeholder_id` = `stakeholders`.`id` 
INNER JOIN `stakeholder_profiles` ON `stakeholder_profiles`.`stakeholder_id` = `stakeholders`.`id` 
LEFT JOIN `stakeholder_profile_tag` ON `stakeholder_profile_tag`.`stakeholder_profile_id` = `stakeholder_profiles`.`id` 
LEFT JOIN `stakeholder_profile_group` ON `stakeholder_profile_group`.`stakeholder_profile_id` = `stakeholder_profiles`.`id` 
LEFT JOIN `influences` ON `influences`.`stakeholder_id` = `stakeholders`.`id` 
INNER JOIN `projects` ON `project_stakeholder`.`project_id` = `projects`.`id` 


LEFT JOIN (

    /*! This is the bit that doesn't work */ 
    SELECT stakeholder_id, MAX(created_at) AS maxca 
    FROM influences 
    WHERE 
    project_id = 1 AND 
    deleted_at IS NULL 
    GROUP BY stakeholder_id 


) 

iu ON `iu`.`stakeholder_id` = influences.stakeholder_id AND 
iu.maxca = influences.created_at 



WHERE `projects`.`id` = '1' 
GROUP BY `stakeholders`.`id` 

Это похоже на работу:

SELECT `stakeholders`.*, iu.influence 
FROM `project_stakeholder` 
INNER JOIN `stakeholders` ON `project_stakeholder`.`stakeholder_id` = `stakeholders`.`id` 
INNER JOIN `stakeholder_profiles` ON `stakeholder_profiles`.`stakeholder_id` = `stakeholders`.`id` 
LEFT JOIN `stakeholder_profile_tag` ON `stakeholder_profile_tag`.`stakeholder_profile_id` = `stakeholder_profiles`.`id` 
LEFT JOIN `stakeholder_profile_group` ON `stakeholder_profile_group`.`stakeholder_profile_id` = `stakeholder_profiles`.`id` 
INNER JOIN `projects` ON `project_stakeholder`.`project_id` = `projects`.`id` 


LEFT JOIN (

    select i1.* 
    from influences i1 
    join 
    (
     SELECT stakeholder_id, MAX(created_at) AS maxca 
     FROM influences 
     WHERE project_id = 1 
     AND deleted_at IS NULL 
     GROUP BY stakeholder_id 
    ) i2 on i1.stakeholder_id = i2.stakeholder_id 
     and i1.created_at = i2.maxca 

) iu ON `iu`.`stakeholder_id` = stakeholders.id 



WHERE `projects`.`id` = '1' 
GROUP BY `stakeholders`.`id` 
+0

Вашей 'группа by' недействительна SQL. MySQL предпочитает вместо этого возвращать случайные результаты (они называются неопределенными). Каждая другая СУБП просто отвергает это утверждение. См. Здесь для деталей: http://www.mysqlperformanceblog.com/2006/09/06/wrong-group-by-makes-your-queries-fragile/ –

ответ

1
select i1.* 
from influences i1 
join 
(
    SELECT stakeholder_id, MAX(created_at) AS maxca 
    FROM influences 
    WHERE project_id = 1 
    AND deleted_at IS NULL 
    GROUP BY stakeholder_id 
) i2 on i1.stakeholder_id = i2.stakeholder_id 
    and i1.created_at = i2.maxca 
+0

Это работает, но я не могу представить его в своем существующее заявление, не могли бы вы дать мне руку? – Jimmyt1988

+0

Наверху: не выбирайте 'iu.influence'. Выберите «влияния. Влияние». И вы можете удалить избыточные столбцы из внутреннего выбора. –

+0

Я пересмотрел свой код, с изменением, которое вы сделали, но он по-прежнему возвращает 5 вместо 3. спасибо за ваше терпение. – Jimmyt1988

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