SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.02.2012 01:35:10

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Соединение таблиц с дополнительными условиями

Приветствую, коллеги.

Подскажите по сабжу плиз.

Есть две таблицы - таблица талонов - request (главное поле - id талона) и таблица request_event (первичный ключ - id и request_id, которое ссылается на поле id таблицы request) содержащие историю событий, происходящих с этим талоном.

Возникла потребность в выборке талонов и их последнего события ("последнесть" события определяется максимальным id в рамках талона).

Попытался вот так: SELECT r.*, (SELECT * FROM request_event WHERE request_id = r.id ORDER BY id DESC LIMIT 1) FROM request r;
естественно нарвался на
ERROR 1241 (21000): Operand should contain 1 column(s)

Вот так
SELECT r.*, (SELECT id FROM request_event WHERE request_id = r.id ORDER BY id DESC LIMIT 1) FROM request r;
работает, но нужно получить все поля из истории талона, а не только id.

Работает вот такая выборка:

SELECT r.*,rre.* FROM request r INNER JOIN request_event rre ON (r.id = rre.request_id) INNER JOIN (SELECT max(id) as maxid, request_id FROM request_event GROUP BY request_id) rel ON (r.id = rel.request_id AND rre.id = rel.maxid )

Вопрос - оптимальный ли это способ (индексы есть на полях, по которым соединение проводится, но смущает соединение по трём таблицам) или можно как-то пошустрее?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#2 03.02.2012 01:54:38

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Соединение таблиц с дополнительными условиями

ИМХО, без трех таблиц не обойтись:

SELECT r.*,rre.* FROM (SELECT max(id) as maxid, request_id FROM request_event GROUP BY request_id) rel
JOIN request_event rre ON rre.id = rel.maxid
JOIN request r ON r.id = rel.request_id

Неактивен

 

#3 03.02.2012 01:57:25

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Соединение таблиц с дополнительными условиями

Спасибо за ответ. Вася, а почему ты поменял местами таблицы в FROM? Я вроде никаких больше изменений не углядел.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 03.02.2012 02:00:53

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Соединение таблиц с дополнительными условиями

Для удобства восприятия. У меня условий на объединение меньше.

Неактивен

 

#5 03.02.2012 02:04:30

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Соединение таблиц с дополнительными условиями

Согласен, у меня одно лишнее получается. Ну, так еще ничего, если бы по два последних события вытягивал для каждой истории талона, так вообще был бы аншлаг, где либо с переменными надо крутиться либо со страшными having'ами smile.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 03.02.2012 03:59:19

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Соединение таблиц с дополнительными условиями

Если там еще есть лимит 20 после всего запроса, то может оказаться выгоднее получить сначала только id, а потом уже для выбранных 20 записей все остальные поля.

Неактивен

 

#7 03.02.2012 22:19:00

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Соединение таблиц с дополнительными условиями

deadka написал:

Попытался вот так: SELECT r.*, (SELECT * FROM request_event WHERE request_id = r.id ORDER BY id DESC LIMIT 1) FROM request r;
естественно нарвался на
ERROR 1241 (21000): Operand should contain 1 column(s)

По этому поводу есть одна хитрая техника,  с тобой любимыми перемененными :-)

SELECT r.*, (SELECT ( (@id:=id) and (@request_id:=request_id) ) as empty FROM request_event WHERE request_id = r.id ORDER BY id DESC LIMIT 1),@id,@request_id
FROM request r;

Неактивен

 

#8 04.02.2012 01:04:03

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Соединение таблиц с дополнительными условиями

evgeny написал:

По этому поводу есть одна хитрая техника,  с тобой любимыми перемененными :-)

SELECT r.*, (SELECT ( (@id:=id) and (@request_id:=request_id) ) as empty FROM request_event WHERE request_id = r.id ORDER BY id DESC LIMIT 1),@id,@request_id
FROM request r;

Да, неплохо, спасибо smile. Читерство smile.
Правда надо следить, чтобы какое-то из условий в false не превратилось, иначе оно может перестать выполняться, на это уже напарывались.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson