Сложный запрос из 2 таблиц

Статус
В этой теме нельзя размещать новые ответы.

Denixxx

Мой дом здесь!
Регистрация
7 Фев 2014
Сообщения
244
Реакции
216
Есть 2 таблицы — в одной объекты магазина (items), в другой — картинки к ним (itemimg);
В itemimg.itemid — это поле из items.id
Задача: установить название айтема (`items`.`name`) в качестве описания картинки (`itemimg`.`desc`) если эти два поля совпали.
Запрос:
Код:
UPDATE `itemimg` SET `itemimg`.`desc` = `items`.`name` WHERE `itemimg`.`itemid` = `items`.`id`
Вывод:
Код:
#1054 - Unknown column 'items.id' in 'where clause'
Что-то пошло не так, а что — не понятно.
id в items имеется.
Понимаю, что видимо через select делать надо, но как — не пойму.
Подскажите, пожалуйста — в MySQL не силен.
 
Код:
UPDATE `itemimg` AS img
LEFT OUTER JOIN `items` AS i
    ON img.itemid = i.id
SET img.desc = i.name
 
Код:
UPDATE `itemimg` AS img
LEFT OUTER JOIN `items` AS i
    ON img.itemid = i.id
SET img.desc = i.name
Очень-очень большое спасибо за эту магию, но, честно говоря, совершенно не понял что происходит:)
Понимаю, что наглею и прошу слишком многого, но не могли бы Вы пояснить — что происходит по коду LEFT OUTER JOIN и пр.
Из этого примера я понял только работу операторов UPDATE, AS, SET
//PS я на самом деле нашёл выход и сделал через простые селекты и апдейты с foreach. Но это абсолютно не кошерно и хотелось бы очень узнать, как делают профи в подобных случаях. Применять без понимания — плохо, уж лучше тот говнокод что получился сейчас:)
 
Во-первых, работа с базой данных никогда не должна реализовываться посредством функции PHP foreach. Особенно в случае функций UPDATE и INSERT. Цикличные запросы к базе данных создают неоправданную нагрузку на процессор MySQL, что в свою очередь может сказываться на производительности сервера, делать его уязвимым к DDoS атакам. Информация по JOIN-ам в обилии доступна в интернете. Не вижу особого смысла заниматься копированием.

Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся

Если что-то не ясно - спрашивайте.
 
Ещё раз спасибо за помощь и ссылки, но может кому-то ещё будет полезно про джойны.
Я почитал по ссылкам — такое ощущение, что люди специально писали так, чтобы не было понятно никому.
В википедии ещё туда-сюда, а в остальных вообще всё плохо.
Неудивительно, что в подобных вещах не так много специалистов.
Вот ссылка, которая расставила в моей голове всё на свои места (правда, на английском).
Для просмотра ссылки Войди или Зарегистрируйся
Парень объяснил — супер, всё понятно и наглядно.
По рисункам даже понятно, почему LEFT, а почему RIGHT JOIN.
Планирую перевести и утащить к себе.
Джойны как регулярки — нужны нечасто и из-за этого забываются.
Но, как и регулярки, инструмент очень полезный.
Лучше иметь мануал под рукой:)
 
Джойны как регулярки — нужны нечасто и из-за этого забываются.
Когда поймешь, что такое джойны, использовать будешь довольно часто :)
Для просмотра ссылки Войди или Зарегистрируйся - на русском.
Не забывайте, что FULL OUTER JOIN в MySQL нет, приходится костылить - Для просмотра ссылки Войди или Зарегистрируйся

А вообще эти кружочки называются - Для просмотра ссылки Войди или Зарегистрируйся
 

Вложения

  • Visual_SQL_JOINS.jpg
    Visual_SQL_JOINS.jpg
    245,1 KB · Просмотры: 17
Последнее редактирование:
На другом форуме наконец-то ответили, хоть и гораздо позже, но, как выяснилось, можно совсем без джойнов.
Думаю, что и тут будет интересно узнать ответ:
Джойн тут ни при чем абсолютно. Все очень просто. Ты сначала залочил таблицу itemimg для обновления. В результате мускуль снял снапшот с нее (при любой записи таким образом ставится блокировка на чтение пока этот активный снапшот не актуализируется по завершению транзакции записи). Потом ты захотел в снапшоте почитать поле которого в снапшоте в принципе нет (items.id)

Так что
UPDATE `itemimg`, `items` SET `itemimg`.`desc` = `items`.`name` WHERE `itemimg`.`itemid` = `items`.`id`
То есть, нужно было лишь добавить через запятую вторую таблицу.
Всё это у меня от недопонимания работы Мускуля получилось:)
 
На другом форуме наконец-то ответили, хоть и гораздо позже, но, как выяснилось, можно совсем без джойнов.
Это тоже джойн, только записан в более простой форме и не "LEFT OUTER JOIN", а простой "INNER JOIN"
INNER JOIN and , (comma) are semantically equivalent in the absence of a join condition: both produce a Cartesian product between the specified tables (that is, each and every row in the first table is joined to each and every row in the second table).
Для просмотра ссылки Войди или Зарегистрируйся

Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху