ФорумРазработкаБазы данных → JOIN таблицы через Ж

JOIN таблицы через Ж

  • indeego

    Сообщения: 125 Репутация: N Группа: Кто попало

    Spritz 9 октября 2012 г. 2:09

    Парни привет!
    Есть 3 таблицы:

    catalog
    id|type|pid|title
    1| 1| 0|Верх
    2| 2| 1|Ссылкохз куда
    catalog_types
    id|name|tmpl|table
    1|страница|page|pages
    2|ссылка |url |urls

    pages
    id|rel|content
    1| 1|Хуйня какая то

    urls
    id|rel|content
    1| 2| http://pyha.ru


    Задача:
    Выбрать одним запросом, можно с джоинами все ноды каталога и их содержимое, т.е. выборка должна выглядеть следующим образом:
    id|title|content
    1|Верх|Хуйня какая то
    2|Ссылкохз куда|http://pyha.ru


    SELECT c.id,c.title,v.content
    FROM catalog c
    JOIN catalog_types ct ON ct.id=c.type
    JOIN ct.table v ON v.rel=c.id


    Как бы так изъебнуться, чтобы при составлении второго джоина в запросе источником была таблица и первого джоина.
    Спустя 34 сек.
    Составленный мною запрос не работает в MySQL.
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 9 октября 2012 г. 2:14, спустя 5 минут 37 секунд

    Как бы так изъебнуться, чтобы при составлении второго джоина в запросе источником была таблица и первого джоина.
    Спустя 34 секунды добавил
    Составленный мною запрос не работает в MySQL.

    да никак. тебе надо будет юзать prepared statements ну и stored procedures если ты хочешь это провернуть силами базы только :-)
    Сапожник без сапог
  • indeego

    Сообщения: 125 Репутация: N Группа: Кто попало

    Spritz 9 октября 2012 г. 2:19, спустя 5 минут 14 секунд

    phpdude, ясно.
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 11 октября 2012 г. 8:49, спустя 2 дня 6 часов 29 минут

    лол.
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 11 октября 2012 г. 19:52, спустя 11 часов 3 минуты 30 секунд

    Конечно нельзя джойнить по имени таблицы. Можно просто джойнить по id )))
    Насколько я понимаю задачу, у таблиц pages и url колонка id не пересекается, т.к. одна и та же запись в catalog не может быть двух типов одновременно.

    Можно реализовать через LEFT JOIN & ifnull():

    SELECT c.id, c.type, c.title, ifnull(p.content, u.content) AS content
    FROM catalog AS c
    LEFT JOIN pages AS p ON p.id=c.id
    LEFT JOIN urls AS u ON u.id=c.id

    вместо ifnull можно использовать if() или CASE, любую подходящую условную фигню, сути не меняет.

    Другой вариант — через INNER JOIN & UNION:

    SELECT c.id, c.type, c.title, p.content
    FROM catalog AS c
    JOIN pages AS p ON p.id=c.id
    UNION
    SELECT c.id, c.type, c.title, u.content
    FROM catalog AS c
    JOIN urls AS u ON u.id=c.id

    ιιlllιlllι унц-унц

Пожалуйста, авторизуйтесь, чтобы написать комментарий!