Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Приветствую, коллеги.
Подскажите по сабжу плиз.
Есть две таблицы - таблица талонов - 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 )
Вопрос - оптимальный ли это способ (индексы есть на полях, по которым соединение проводится, но смущает соединение по трём таблицам) или можно как-то пошустрее?
Неактивен
ИМХО, без трех таблиц не обойтись:
Неактивен
Спасибо за ответ. Вася, а почему ты поменял местами таблицы в FROM? Я вроде никаких больше изменений не углядел.
Неактивен
Для удобства восприятия. У меня условий на объединение меньше.
Неактивен
Согласен, у меня одно лишнее получается. Ну, так еще ничего, если бы по два последних события вытягивал для каждой истории талона, так вообще был бы аншлаг, где либо с переменными надо крутиться либо со страшными having'ами .
Неактивен
Если там еще есть лимит 20 после всего запроса, то может оказаться выгоднее получить сначала только id, а потом уже для выбранных 20 записей все остальные поля.
Неактивен
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)
По этому поводу есть одна хитрая техника, с тобой любимыми перемененными :-)
Неактивен
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;
Да, неплохо, спасибо . Читерство .
Правда надо следить, чтобы какое-то из условий в false не превратилось, иначе оно может перестать выполняться, на это уже напарывались.
Неактивен
Страниц: 1