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

Тема в разделе "Базы данных", создана пользователем Denixxx, 28 сен 2014.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    196
    Есть 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 не силен.
     
  2. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    117
    Симпатии:
    495
    Код:
    UPDATE `itemimg` AS img
    LEFT OUTER JOIN `items` AS i
        ON img.itemid = i.id
    SET img.desc = i.name
     
    latteo и Denixxx нравится это.
  3. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    196
    Очень-очень большое спасибо за эту магию, но, честно говоря, совершенно не понял что происходит:)
    Понимаю, что наглею и прошу слишком многого, но не могли бы Вы пояснить — что происходит по коду LEFT OUTER JOIN и пр.
    Из этого примера я понял только работу операторов UPDATE, AS, SET
    //PS я на самом деле нашёл выход и сделал через простые селекты и апдейты с foreach. Но это абсолютно не кошерно и хотелось бы очень узнать, как делают профи в подобных случаях. Применять без понимания — плохо, уж лучше тот говнокод что получился сейчас:)
     
  4. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    117
    Симпатии:
    495
    Во-первых, работа с базой данных никогда не должна реализовываться посредством функции PHP foreach. Особенно в случае функций UPDATE и INSERT. Цикличные запросы к базе данных создают неоправданную нагрузку на процессор MySQL, что в свою очередь может сказываться на производительности сервера, делать его уязвимым к DDoS атакам. Информация по JOIN-ам в обилии доступна в интернете. Не вижу особого смысла заниматься копированием.

    https://ru.wikipedia.org/wiki/Join_(SQL)
    http://www.mysql.ru/docs/man/JOIN.html
    http://www.mysql.ru/docs/man/LEFT_JOIN_optimisation.html

    Если что-то не ясно - спрашивайте.
     
    latteo и Denixxx нравится это.
  5. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    196
    Ещё раз спасибо за помощь и ссылки, но может кому-то ещё будет полезно про джойны.
    Я почитал по ссылкам — такое ощущение, что люди специально писали так, чтобы не было понятно никому.
    В википедии ещё туда-сюда, а в остальных вообще всё плохо.
    Неудивительно, что в подобных вещах не так много специалистов.
    Вот ссылка, которая расставила в моей голове всё на свои места (правда, на английском).
    http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
    Парень объяснил — супер, всё понятно и наглядно.
    По рисункам даже понятно, почему LEFT, а почему RIGHT JOIN.
    Планирую перевести и утащить к себе.
    Джойны как регулярки — нужны нечасто и из-за этого забываются.
    Но, как и регулярки, инструмент очень полезный.
    Лучше иметь мануал под рукой:)
     
    latteo нравится это.
  6. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.549
    Симпатии:
    1.433
    Когда поймешь, что такое джойны, использовать будешь довольно часто :)
    http://www.profstat.ru/article/sql-joins.html - на русском.
    Не забывайте, что FULL OUTER JOIN в MySQL нет, приходится костылить - http://stackoverflow.com/questions/4796872/full-outer-join-in-mysql

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

    Вложения:

    Последнее редактирование: 29 сен 2014
    Renny, RedRabbit и Denixxx нравится это.
  7. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    196
    На другом форуме наконец-то ответили, хоть и гораздо позже, но, как выяснилось, можно совсем без джойнов.
    Думаю, что и тут будет интересно узнать ответ:
    То есть, нужно было лишь добавить через запятую вторую таблицу.
    Всё это у меня от недопонимания работы Мускуля получилось:)
     
  8. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.549
    Симпатии:
    1.433
    Это тоже джойн, только записан в более простой форме и не "LEFT OUTER JOIN", а простой "INNER JOIN"
    http://dev.mysql.com/doc/refman/5.0/en/join.html

    http://hashmysql.org/wiki/Comma_vs_JOIN
    http://stackoverflow.com/questions/10895764/mysql-join-comma-separated-field
     
    Denixxx нравится это.
Статус темы:
Закрыта.