Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Выборка записей, имеющих максимальную дату в другой таблице
|
|||
|---|---|---|---|
|
#18+
Всех приветствую. Задача простая, но туплю. Скрипт переписки, в базе две таблицы, А и В, в одной темы, в другой ответы к темам. Общение в теме только между двумя пользователями: автором темы и администратором. Структура таблицы А: Код: sql 1. 2. 3. 4. 5. 6. uid — ID пользователя/автора; state — 0 или 1 (открыто/закрыто). Структура таблицы В: Код: sql 1. 2. 3. 4. 5. 6. 7. uid — ID автора ответа, либо автора самой темы, либо администратора; theme_id — ID темы из таблицы А; date — дата ответа. Задача: выбрать ID тех открытых тем (где `state`='0'), последний комментарий к которым оставлен не администрацией, либо вообще отсутствует. Сходу показалось, что поможет простой вложенный запрос, вроде: Код: sql 1. 2. 3. Но вложенный запрос, который вернул бы только один столбец, не склеился. Заранее всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 22:05 |
|
||
|
Выборка записей, имеющих максимальную дату в другой таблице
|
|||
|---|---|---|---|
|
#18+
Leningrad00последний комментарий к которым оставлен не администрацией, либо вообще отсутствует.Вариант НЕ (последний ответ оставлен администрацией) попроще будет. В т.ч. в реализации в запросе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 22:28 |
|
||
|
Выборка записей, имеющих максимальную дату в другой таблице
|
|||
|---|---|---|---|
|
#18+
AkinaВариант НЕ (последний ответ оставлен администрацией) попроще будет. В т.ч. в реализации в запросе.Если присмотреться к последней вставке кода в моем первом сообщении, станет очевидно, что это я осилил ) Далее мозг спит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 22:38 |
|
||
|
Выборка записей, имеющих максимальную дату в другой таблице
|
|||
|---|---|---|---|
|
#18+
Отбираем для каждой темы в таблице ответов последнее сообщение. FAQ раздела скажет, как именно. Связываем темы и этот подзапрос по условиям равенства ИД темы и неравенства uid ответа из подзапроса uid-у администратора. Обрати внимание - оба условия - в секции ON. Выводим ID темы. Всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 22:47 |
|
||
|
Выборка записей, имеющих максимальную дату в другой таблице
|
|||
|---|---|---|---|
|
#18+
Казалось, можно найти способ попроще. ОК, спасибо. Если придумаю проще, опубликую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 22:56 |
|
||
|
Выборка записей, имеющих максимальную дату в другой таблице
|
|||
|---|---|---|---|
|
#18+
Это порно? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. [ 3 ] Получаем ID последнего ответа к каждой теме; [ 2 ] получаем ID тем для этих ответов, но [ 5 ] лишь тех, которые оставлены администратором (`uid`='0'); [ 1 ] получаем ID всех открытых (`state`='0') тем, ID которых отличается от полученных на предыдущем шаге. Очень смущает вопрос прожорливости для больших таблиц, хорошо бы получать на первом этапе последний ID только открытых тем, но это другая история. Главный вопрос озвучен перед кодом запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 14:34 |
|
||
|
Выборка записей, имеющих максимальную дату в другой таблице
|
|||
|---|---|---|---|
|
#18+
Leningrad00Это порно? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. [ 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. Если надо получать результат очень часто и очень быстро, то возможно поставить (и снимать) "последний не админ" флаг триггером на вставку. Но сначала надо разбиратся с требованиям к задаче -- как часто этот запрос надо гнать? какой размер таблиц? какие скорости наблюдаете сейчас? какая желаемая скорость? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 16:52 |
|
||
|
Выборка записей, имеющих максимальную дату в другой таблице
|
|||
|---|---|---|---|
|
#18+
Запрос гнать надо не часто, записей будет не много. Про флаг «админ»/«не админ» думал, решил, что это моветон и избыточность. Но если в будущем будут ощутимые проблемы с производительностью, наверное, так и сделаем. javajdbc , большое спасибо. Akina , аналогично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 17:49 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=84&tid=1831074]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 178ms |

| 0 / 0 |
