powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Магия
12 сообщений из 12, страница 1 из 1
Магия
    #40033893
Linkoln_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго всем дня. Возникла такая ситуация. Есть две таблицы contact (поля id, email) и contact_emails (поля contact_id, email), нужно обновить столбец email таблицы contact значениями email из таблицы contact_emails но в таблице contact_emails поле contact_id не уникальное и следовательно может быть несколько строк с одним и тем же contact_id. если такая строчка встречается, нужно выбрать любое значение (пусть хоть первое), мой текущий(наивный) код
Код: plaintext
1.
2.
3.
UPDATE contact ct
SET    email =  (SELECT email FROM contact_emails 
WHERE (SELECT DISTINCT contact_id FROM contact_emails)  =  ct.id )
но у меня ничего конечно же не получается, пишет что запрос вернул более одной строки, пробовал через GROUP BY- аналогично. Потратил день на гуглеж, мысли закончились, если у кого-нибудь есть идеи, как можно реализовать, прошу помочь
...
Рейтинг: 0 / 0
Магия
    #40033908
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Linkoln_
пишет что запрос вернул более одной строки
Так поставьте ограничение
Код: sql
1.
LIMIT 1

будет возвращаться всегда одна запись. Направлением сортировки можно задать какая именно запись - первая или последняя.
...
Рейтинг: 0 / 0
Магия
    #40033914
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте UPDATE, Multiple-table syntax.
...
Рейтинг: 0 / 0
Магия
    #40033919
Linkoln_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gluck99
Linkoln_
пишет что запрос вернул более одной строки
Так поставьте ограничение
Код: sql
1.
LIMIT 1

будет возвращаться всегда одна запись. Направлением сортировки можно задать какая именно запись - первая или последняя.

Не помогло, все-равно
авторUPDATE `fish_main5`.`wa_contact` wc
SET email = (SELECT email FROM `fish_main5`.`wa_contact_emails`
WHERE (SELECT DISTINCT contact_id FROM `fish_main5`.`wa_contact_emails`) = wc.id LIMIT 1)

Ответ MySQL: Документация
#1242 - Subquery returns more than 1 row
...
Рейтинг: 0 / 0
Магия
    #40033920
Linkoln_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой, не то скинул, так понятно, что не должно сработать.
вот так пробовал
UPDATE `fish_main5`.`wa_contact` wc SET email = (SELECT email FROM `fish_main5`.`wa_contact_emails` WHERE (SELECT contact_id FROM `fish_main5`.`wa_contact_emails` LIMIT 1) = wc.id )

То же самое
...
Рейтинг: 0 / 0
Магия
    #40033974
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Linkoln_,
1) Используйте тэги подсветки синтаксиса, иначе просто вырви глаз. Вы же видите, как другие делают, делайте так же.
2) Пробуйте с JOIN'ом, это самый грамотный способ.
3) Не могу понять, почему у вас 2 SELECT'а? Что мешало написать просто:
Код: sql
1.
2.
3.
UPDATE contact ct
SET email =  
  (SELECT ce.email FROM contact_emails ce WHERE ce.contact_id = ct.id /*ORDER BY ce.email DESC*/ LIMIT 1)

Закомментирована сортировка по полю email, соотв. если выставить направление сортировки (ASC или DESC), в таблицу contact будут попадать разные значения поля email из таблицы contact_emails.
...
Рейтинг: 0 / 0
Магия
    #40034017
Linkoln_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gluck99,
Пробовал, зависает на 2 минуты, а потом обваливается с ошибкой превышения времени ожидания
...
Рейтинг: 0 / 0
Магия
    #40034018
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Linkoln_
Пробовал, зависает на 2 минуты, а потом обваливается с ошибкой превышения времени ожидания
Сколько записей в таблицах? Индексы хоть есть?
...
Рейтинг: 0 / 0
Магия
    #40034020
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да чёрт возьми... ну вроде указал, что почитать - так нет, всё равно будем делать через одно место...
Код: sql
1.
2.
3.
UPDATE contact ct
JOIN contact_emails ce ON ce.contact_id =  ct.id
SET ct.email = ce.email
...
Рейтинг: 0 / 0
Магия
    #40034072
Linkoln_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gluck99,
Индексы есть 7512 записей
...
Рейтинг: 0 / 0
Магия
    #40034073
Linkoln_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Спасибо, помогло. Действительно помогло, правда, я не разобрался, как это сработало, буду штудировать JOIN
...
Рейтинг: 0 / 0
Магия
    #40034282
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Linkoln_
Спасибо, помогло. Действительно помогло, правда, я не разобрался, как это сработало, буду штудировать JOIN
Вообще JOIN - это правильно. Но даже ваш "наивный" код (в моей редакции) вполне работает и обновляет таблицу меньше чем за секунду (с джойнами примерно за то же время, может, чуть быстрее). Скорее всего у вас какая-то проблема с индексами.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Магия
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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