powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка записей, имеющих максимальную дату в другой таблице
8 сообщений из 8, страница 1 из 1
Выборка записей, имеющих максимальную дату в другой таблице
    #39369025
Leningrad00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всех приветствую.
Задача простая, но туплю.

Скрипт переписки, в базе две таблицы, А и В, в одной темы, в другой ответы к темам. Общение в теме только между двумя пользователями: автором темы и администратором.

Структура таблицы А:
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE `themes` (
`id` int(12),
`uid` int(12),
`text` varchar(3000),
`state` int(1)
)


uid — ID пользователя/автора; state — 0 или 1 (открыто/закрыто).
Структура таблицы В:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE `themes_answers` (
`id` int(12),
`uid` int(12),
`theme_id` int(12),
`date` int(12),
`text` varchar(3000)
)


uid — ID автора ответа, либо автора самой темы, либо администратора; theme_id — ID темы из таблицы А; date — дата ответа.

Задача: выбрать ID тех открытых тем (где `state`='0'), последний комментарий к которым оставлен не администрацией, либо вообще отсутствует.
Сходу показалось, что поможет простой вложенный запрос, вроде:
Код: sql
1.
2.
3.
SELECT * FROM `themes` WHERE (`state`='0') AND (`id` NOT IN 
(/*вложенный запрос к таблице В, возвращает ID тем, последний комментарий к которым оставлен администратором*/)
)


Но вложенный запрос, который вернул бы только один столбец, не склеился.

Заранее всем спасибо.
...
Рейтинг: 0 / 0
Выборка записей, имеющих максимальную дату в другой таблице
    #39369036
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leningrad00последний комментарий к которым оставлен не администрацией, либо вообще отсутствует.Вариант НЕ (последний ответ оставлен администрацией) попроще будет. В т.ч. в реализации в запросе.
...
Рейтинг: 0 / 0
Выборка записей, имеющих максимальную дату в другой таблице
    #39369041
Leningrad00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaВариант НЕ (последний ответ оставлен администрацией) попроще будет. В т.ч. в реализации в запросе.Если присмотреться к последней вставке кода в моем первом сообщении, станет очевидно, что это я осилил )
Далее мозг спит.
...
Рейтинг: 0 / 0
Выборка записей, имеющих максимальную дату в другой таблице
    #39369045
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отбираем для каждой темы в таблице ответов последнее сообщение. FAQ раздела скажет, как именно.
Связываем темы и этот подзапрос по условиям равенства ИД темы и неравенства uid ответа из подзапроса uid-у администратора. Обрати внимание - оба условия - в секции ON.
Выводим ID темы.
Всё.
...
Рейтинг: 0 / 0
Выборка записей, имеющих максимальную дату в другой таблице
    #39369049
Leningrad00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Казалось, можно найти способ попроще.
ОК, спасибо.

Если придумаю проще, опубликую.
...
Рейтинг: 0 / 0
Выборка записей, имеющих максимальную дату в другой таблице
    #39369252
Leningrad00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это порно?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
/*1*/	SELECT `id` FROM `themes` WHERE (`state`='0') AND (`id` NOT IN (

/*2*/		SELECT `theme_id` FROM `themes_answers` WHERE `id` IN (

/*3*/			SELECT max(`id`) FROM `themes_answers` GROUP BY `theme_id`

/*4*/			)

/*5*/		AND (`uid`='0')

/*6*/		) 

/*7*/	);


[ 3 ] Получаем ID последнего ответа к каждой теме;
[ 2 ] получаем ID тем для этих ответов, но [ 5 ] лишь тех, которые оставлены администратором (`uid`='0');
[ 1 ] получаем ID всех открытых (`state`='0') тем, ID которых отличается от полученных на предыдущем шаге.

Очень смущает вопрос прожорливости для больших таблиц, хорошо бы получать на первом этапе последний ID только открытых тем, но это другая история.
Главный вопрос озвучен перед кодом запроса.
...
Рейтинг: 0 / 0
Выборка записей, имеющих максимальную дату в другой таблице
    #39369294
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leningrad00Это порно?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
/*1*/	SELECT `id` FROM `themes` WHERE (`state`='0') AND (`id` NOT IN (

/*2*/		SELECT `theme_id` FROM `themes_answers` WHERE `id` IN (

/*3*/			SELECT max(`id`) FROM `themes_answers` GROUP BY `theme_id`

/*4*/			)

/*5*/		AND (`uid`='0')

/*6*/		) 

/*7*/	);



[ 3 ] Получаем ID последнего ответа к каждой теме;
[ 2 ] получаем ID тем для этих ответов, но [ 5 ] лишь тех, которые оставлены администратором (`uid`='0');
[ 1 ] получаем ID всех открытых (`state`='0') тем, ID которых отличается от полученных на предыдущем шаге.

Очень смущает вопрос прожорливости для больших таблиц, хорошо бы получать на первом этапе последний ID только открытых тем, но это другая история.
Главный вопрос озвучен перед кодом запроса.


...ваше решение -- вполне законное, смотрите аналогичное
решение C1 в этом ФАКе 7543220 .
Остальные решения C2-C5 также могут подойти с минимальной подгонкой.
(ваша задаче чуть легче чем в ФАКе -- у вас максимальное ИД совпадает
с максимальным временем)

насчет производительности -- надо смотреть. В старых версиях оператор IN
работал медлено, в новых -- иногда быстро. МОжет имеет смысл
переписать IN в JOINT.
NOT IN тоже можно переписать в LEFT JOINT с проверкой на NULL.

Если надо получать результат очень часто и очень быстро, то
возможно поставить (и снимать) "последний не админ" флаг триггером
на вставку.

Но сначала надо разбиратся с требованиям к задаче -- как часто
этот запрос надо гнать? какой размер таблиц? какие скорости
наблюдаете сейчас? какая желаемая скорость?
...
Рейтинг: 0 / 0
Выборка записей, имеющих максимальную дату в другой таблице
    #39369308
Leningrad00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запрос гнать надо не часто, записей будет не много.
Про флаг «админ»/«не админ» думал, решил, что это моветон и избыточность. Но если в будущем будут ощутимые проблемы с производительностью, наверное, так и сделаем.

javajdbc , большое спасибо.
Akina , аналогично.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка записей, имеющих максимальную дату в другой таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]