За последние 24 часа нас посетили 72066 программистов и 1652 робота. Сейчас ищут 926 программистов ...

Не совсем простая выборка

Тема в разделе "MySQL", создана пользователем [vs], 13 авг 2009.

  1. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Имеются таблицы типа:
    Код (Text):
    1. catalogs:
    2. |----|
    3. | id |
    4. |----|
    5. | 3  |
    6. | 4  |
    7.  
    8. collections:
    9. |----|---------|
    10. | id | catalog |
    11. |----|---------|
    12. | 1  | 4       |
    13. | 2  | 3       |
    14. | 3  | 4       |
    15.  
    16. photos:
    17. |----|------------|
    18. | id | collection |
    19. |----|------------|
    20. | 1  | 1          |
    21. | 2  | 2          |
    22. | 4  | 3          |
    23. | 6  | 1          |
    Требуется составить два запроса:
    1)Выбрать id всех фотографий (в примере - 1, 4 и 6) которые входят в коллекции (в примере - 1 и 3) каталога 4.
    2)Удалить каталог 4 вместе со всеми его коллекциями и всеми фотографиями в этих коллекциях.

    ...или тут без циклов никак?
     
  2. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    2) FOREIGN KEY ?

    1,2) Можно ещё в photo поле `catalog` пихнуть.
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Гениально! Как я сразу не догадался )))
     
  4. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Может что и подзабыл, но должно работать :wink:
    [sql]
    SELECT `photos.id`
    FROM `photos` p
    LEFT JOIN `collection` c USING (c.id = p.collection)
    WHERE c.catalog = 4;

    DELETE FROM `photos` p WHERE p.collection IN (
    SELECT id FROM `collection` c WHERE c.catalog =4
    )
    DELETE FROM `collection` c WHERE c.catalog = 4;
    DELETE FROM `catalog` where id = 4;
    [/sql]
     
  5. kostyl

    kostyl Guest

    [sql]select ph.id
    from
    photos ph
    left join collection cl on (ph.collection = cl.id )
    where cl.catalog = 4;[/sql]
    2. Поставь фориген
     
  6. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Попробуй это:
    [sql]
    DELETE FROM `catalogs`, `photos`, `collections`
    USING `catalog`, `photos`, `collections`
    WHERE `photos`.`collection`=`collections`.`id`
    AND `collections`.`catalog`=`catalogs`.`id`
    AND `catalogs`.`id`=4[/sql]

    P.S. Не рекомендую играть со множественными числительными (то есть photos и photo). Лично у меня такие вещи постоянно вызывали проблемы - забывал, где писать s, а где нет.
     
  7. kostyl

    kostyl Guest

    люди что есть USING ? Используя?
     
  8. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Типа того. Показывает, какие таблицы нужно объединять. В конструкции с JOIN для объединения должны поля одинаково называться в объединяемых таблицах.
     
  9. kostyl

    kostyl Guest

    Kreker
    Не понял, а какая разница с "ON" ?
     
  10. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    kostyl
    В моем примере ошибка, там действительно должен быть ON. USING написал "по запарке" :)
     
  11. kostyl

    kostyl Guest

    аааа, теперь понял
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Спасибо, отлично работает =) Всем тоже спасибо.
    А как внешний ключ (фориген) тут можно использовать?
     
  13. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    На всякий случай расскажу:

    Две таблицы

    item
    id | category | title | text

    category
    id | name

    Задача: выбрать все статьи и названия категорий к ним:
    [sql]
    SELECT `item`.`title`, `category`.`name`
    FROM `item`
    LEFT JOIN `category` ON `category`.`id`=`item`.`category`


    title name
    Овощное рагу Рецепты
    Курица Рецепты
    69 Позы
    [/sql]

    ON нужен, когда необходимо связать таблицы с разными именами полей.


    А теперь USING:

    item
    id | category_id | title | text

    category
    category_id | name

    [sql]
    SELECT `item`.`title`, `category`.`name`
    FROM `item`
    LEFT JOIN `category` USING (`category_id`)


    title name
    Овощное рагу Рецепты
    Курица Рецепты
    69 Позы
    [/sql]


    Если не сложно, можешь мой вариант проверить?
     
  14. kostyl

    kostyl Guest

    Kreker
    Спасибо. Я когда-то юзал, но забил на этот метод и забыл.