Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка записей, имеющих максимальную дату в другой таблице / 8 сообщений из 8, страница 1 из 1
16.12.2016, 22:05
    #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
16.12.2016, 22:28
    #39369036
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка записей, имеющих максимальную дату в другой таблице
Leningrad00последний комментарий к которым оставлен не администрацией, либо вообще отсутствует.Вариант НЕ (последний ответ оставлен администрацией) попроще будет. В т.ч. в реализации в запросе.
...
Рейтинг: 0 / 0
16.12.2016, 22:38
    #39369041
Leningrad00
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка записей, имеющих максимальную дату в другой таблице
AkinaВариант НЕ (последний ответ оставлен администрацией) попроще будет. В т.ч. в реализации в запросе.Если присмотреться к последней вставке кода в моем первом сообщении, станет очевидно, что это я осилил )
Далее мозг спит.
...
Рейтинг: 0 / 0
16.12.2016, 22:47
    #39369045
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка записей, имеющих максимальную дату в другой таблице
Отбираем для каждой темы в таблице ответов последнее сообщение. FAQ раздела скажет, как именно.
Связываем темы и этот подзапрос по условиям равенства ИД темы и неравенства uid ответа из подзапроса uid-у администратора. Обрати внимание - оба условия - в секции ON.
Выводим ID темы.
Всё.
...
Рейтинг: 0 / 0
16.12.2016, 22:56
    #39369049
Leningrad00
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка записей, имеющих максимальную дату в другой таблице
Казалось, можно найти способ попроще.
ОК, спасибо.

Если придумаю проще, опубликую.
...
Рейтинг: 0 / 0
17.12.2016, 14:34
    #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
17.12.2016, 16:52
    #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
17.12.2016, 17:49
    #39369308
Leningrad00
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка записей, имеющих максимальную дату в другой таблице
Запрос гнать надо не часто, записей будет не много.
Про флаг «админ»/«не админ» думал, решил, что это моветон и избыточность. Но если в будущем будут ощутимые проблемы с производительностью, наверное, так и сделаем.

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


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