• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Обновление таблицы

  • Автор темы MiXOH
  • Дата начала
Статус
Закрыто для дальнейших ответов.
M

MiXOH

Приветствую!

У меня такая проблемка. Есть 2 таблицы со связью 1 ко многим.
Таблица 1 (T1):
id, contactid, ...

Таблица 2 (T2):
id, attempts_all, ...

Таблицы связаны по T2.id = T1.contactid.

Необходимо обновить Т2 так чтобы в поле attempts_all было количество записей из Т1 соответствующих данному id.

Возможно ли такое используя только MySQL запросы???
 
A

Aleksey

Честно говоря удивлен, что никто не ответил до сих пор, видимо все в отпусках :)
Вот, все просто и незамысловато:

update t2
set t2.attempts_all=(select count(t1.id)
from t1
where t2.id=t1.contactid);
 
G

Glucklich

Мммда. Просто не совсем понятно зачем все это необходимо? Может топикстартер нам расскажет?
 
M

MiXOH

Спасибо, работает :)

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

Glucklich

Вариант, который вы используете, мягко говоря некрасивый и неграмотный.
Существует несколько способов доступа к данным: выборка по индексу и сканирование таблицы. Так вот в первом случае сервер еще до доступа к данным знает сколько будет возвращено картежей. Если вы думаете, что COUNT() по полю с использованием индекса потребует много ресурсов и времени, вы ошибаетесь.
 
A

Aleksey

Давайте не будем человека ругать ;)
Он спросил, мы ответили. Просто важно знать, что у любой проблемы, как правило, есть несколько решений и мы выбираем не всегда лучшее.

Существует несколько способов доступа к данным: выборка по индексу и сканирование таблицы. Так вот в первом случае сервер еще до доступа к данным знает сколько будет возвращено картежей. Если вы думаете, что COUNT() по полю с использованием индекса потребует много ресурсов и времени, вы ошибаетесь.
Не всегда использование индекса быстрее полного сканирования. Фактически мы даже не знаем, есть ли индексы у таблиц в данном случае :)
Лично мне в этой ситуации не нравиться то, что запрос с UPDATE необходимо запускать при изменении таблицы T1. Тут я согласен с Glucklich: лучше реализовать все через запросы - это даст всегда актуальные данные, а не данные на момент выполнения последнего UPDATE, тем более, что селекты тут совсем и не сложные.
В конце концов создайте вьюшку и юзайте ее как обычную таблицу. Главное - это помнить, что есть разные варианты решения одной задачи ;)
 
G

Glucklich

Не всегда использование индекса быстрее полного сканирования.
В большинстве случаев с точностью наоборот, ведь индексы для того и созданы.
. Фактически мы даже не знаем, есть ли индексы у таблиц в данном случае
А что, сложно их добавить???
 
A

Aleksey

Подождем, пока таблицы разрастутся! Вот тогда чел сам себе все оторвет :) ... или индексы добавит. :)
 
M

MiXOH

Индексы есть!!!!!!!!!!!!!!!

Согласен, что лучше было бы сканировать таблицы каждый раз при построении отчета, но повторюсь еще раз, не в моем маленьком конкретном случае построения одной из частей этого отчета, остальная часть строиться при помощи запросов по таблицам :)

Я не хотел перегружать мозги форумчан кучей инфы, поэтому упростил все как можно больше, попытавшись представить проблему как можно более четко.
 
G

Glucklich

Наше дело предложить, Ваше, к сожалению, - отказаться.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!