Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Два left join плюс group by


Автор: rcdimon 9.3.2014, 10:37
Есть таблица, которая хранит предметы tmc, есть вторая таблица, которая хранит акты действий над предметами. И есть третья таблица, в которой хранится связь предметов и актов дейстивй над ними.

Акты могут быть нескольких типов. Например выдача предмета, приемка предмета, списание и т.д. Акт делается над несколькими предметами одновременно. Например сотруднику выдается 10 предметов. А в третьй таблице уже описываются какие именно предметы выдаются или принимаются по этому акту.

Хочу вывести список всех предметов с указанием последнего акта и типа акта над ними.
Чтобы узнать, что предмет 1 находится на складе, предмет два был выдан сотруднику и сейчас у него и т.д.


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

Делаю простой запрос, который выведет последние акты  по всем предметам в базе


Код

SELECT tmc.tmc_id, MAX(akts_tmc.akts_id) AS max_akts_id FROM  tmc
LEFT JOIN akts_tmc ON tmc.tmc_id = akts_tmc.tmc_id 
GROUP BY tmc.tmc_id


Запрос выдает верный результат
Цитата

tmc_id  max_akts_id 
1    11
2    9
3    NULL


По третьему предмету не было актов. По первому последний акт номер 11, по второму - 9

Теперь хочу добавить в вывод данные о типе акта. Для этого подключаю третью таблицу с актами

Код

SELECT tmc.tmc_id, akts_tmc.akts_id, akts.akts_type_id FROM  tmc
LEFT JOIN akts_tmc ON tmc.tmc_id = akts_tmc.tmc_id 

LEFT JOIN akts ON akts_tmc.akts_id = akts.akts_id


Для начала убрал условие вывода именно последнего акта и сделал вывод всех

Поэтому получит такой ответ



Цитата

tmc_id  akts_id  akts_type_id 
1    9    1
1    10    1
1    11    2
2    9    1
3    NULL    NULL



Смотрим что по предмету 1 посдений акт 11 и тип у него 2
По предмету 2 последний акт номер 9 и тип у него 1

Добавляем MAX и GROUP BY

Код

SELECT tmc.tmc_id, MAX( akts_tmc.akts_id ) , akts.akts_type_id
FROM tmc
LEFT JOIN akts_tmc ON tmc.tmc_id = akts_tmc.tmc_id
LEFT JOIN akts ON akts_tmc.akts_id = akts.akts_id
GROUP BY tmc.tmc_id
LIMIT 0 , 30


Получаем неверный результат

Цитата

tmc_id  MAX(akts_tmc.akts_id)  akts_type_id 
1    11    1
2    9    1
3    NULL    NULL


Получается, что в третьем столце не те данные, которые я хочу, а первые встретившиеся в базе.

Подскажите, пожалуйста, что я делаю не так... И как все-таки получить данные по всем предметам, номерам последних актов над ними и их типы....

Автор: Akina 9.3.2014, 17:04
Доки читать надо. Всё происходит в точности как там описано.
Что делать? получать идентифицирующие сведения в подзапросе, и полные во внешнем запросе.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)