За последние 24 часа нас посетил 16581 программист и 1650 роботов. Сейчас ищут 1940 программистов ...

Объединение таблиц

Тема в разделе "MySQL", создана пользователем oldcoder, 22 май 2008.

  1. oldcoder

    oldcoder Активный пользователь

    С нами с:
    24 мар 2008
    Сообщения:
    28
    Симпатии:
    0
    Никак не могу разобратся с джойнами, прошу помощи на примере. :roll:

    Есть таблица product: поля id и name,
    таблица cart: поля id, productID и userID

    Запросом нужно получить все записи таблицы product, значение id которых присутствует в колонке productID хотя бы один раз.
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    А тут не нужен join
    [sql]SELECT * FROM `product`.`name` FROM `product`,`cart` WHERE `cart`.`productID`=`product`.`id`;[/sql]
     
  3. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
  4. oldcoder

    oldcoder Активный пользователь

    С нами с:
    24 мар 2008
    Сообщения:
    28
    Симпатии:
    0
    Вообще не понял запроса. Сначала извлекаются все поля из `product`.`name`, что вроде как поле таблицы, потом снова FROM... в любом случае он не работает.

    Уточню: в таблице cart может быть сколько угодно записей, где productID равен полю id таблицы product, а может не быть ни одной.

    2 EugeneTM: спасибо, читал, не помогает) Может изза того что на инглише, может перегрелся уже сегодня, а сделать все равно надо.
     
  5. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Быстро вы мнение меняете.

    Для первого. Вариантов несколько: мой запрос, запрос через INNER JOIN (он равноценен моему), запрос через LEFT JOIN (главная таблица cart).
    Для второго варианта годиться LEFT JOIN с управляющей таблицей product.

    Что касаемо моего варианта, так он возвращает имена тех продуктов, которые содержаться в тележке. Только * FROM нужно вычеркнуть, ибо по случайности не удалил.
     
  6. oldcoder

    oldcoder Активный пользователь

    С нами с:
    24 мар 2008
    Сообщения:
    28
    Симпатии:
    0
    Это как раз я понял, только как это на MySQL записать?

    Пишу:
    [sql]
    SELECT * FROM cart
    LEFT JOIN product ON cart.productID=product.id
    [/sql]

    но тогда $row['id'] в результирующем наборе почемуто пустое
     
  7. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Ваш запрос выбирает все товары из тележки не обращая внимания, есть ли они в таблице продуктов.
     
  8. oldcoder

    oldcoder Активный пользователь

    С нами с:
    24 мар 2008
    Сообщения:
    28
    Симпатии:
    0
    а как???
     
  9. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Вы меня запутали. То одно выбрать, то другое.
    Напишите структуру базы и что нужно получить на выводе.
     
  10. oldcoder

    oldcoder Активный пользователь

    С нами с:
    24 мар 2008
    Сообщения:
    28
    Симпатии:
    0
    Таблица product:

    id ----- name
    =========
    1 ----- apple
    2 ----- tomat
    ...... и т.д.

    Таблица cart:

    id ------ productID
    ============
    1 ------- 2
    2 ------- 2
    3 ------- 6
    4 ------- 1
    ...... и т.д.

    нужно получить product.id, product.name, но только те, id которых присутствуют в одной из строк cart.productID
     
  11. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    [sql]
    mysql> SELECT `cart`.`id`, `product`.`name` FROM `cart` LEFT JOIN `product` ON (`cart`.`productID` = `product`.`id`) WHERE `name` IS NOT NULL;
    +----+-------+
    | id | name |
    +----+-------+
    | 1 | tomat |
    | 2 | tomat |
    | 4 | apple |
    +----+-------+
    3 rows in set (0.00 sec)
    [/sql]

    [sql]
    mysql> SELECT `cart`.`id`, `product`.`name` FROM `product`, `cart` WHERE `product`.`id`=`cart`.`productID`;
    +----+-------+
    | id | name |
    +----+-------+
    | 1 | tomat |
    | 2 | tomat |
    | 4 | apple |
    +----+-------+
    3 rows in set (0.00 sec)
    [/sql]

    Как я и сказал с самого начала, тут можно обойтись без JOIN.
     
  12. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    Ты уверен ?
    :)
     
  13. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    INNER JOIN возвращает строку из первой таблиц, только если нашёл запись во второй. LEFT JOIN из первой таблицы возвращает запись всегда, даже когда во второй не нашёл ей пару. Используя IS NOT NULL ты посути эмулируешь INNER JOIN при помощи LEFT JOIN :)
     
  14. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    :( Дожили

    Даже комиксы читать не можем.

    Там картинки и и запросы.
    инглишь читать не надо.
     
  15. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Я и не спорю - просто он настойчиво требовал, чтобы у него обязательно был JOIN и начал приводить примеры с JOIN LEFT.