Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Два left join плюс group by 
:(
    Опции темы
rcdimon
Дата 9.3.2014, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: нет
Всего: 2



Есть таблица, которая хранит предметы 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


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

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

PM MAIL ICQ   Вверх
Akina
Дата 9.3.2014, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.