ФорумРазработкаБазы данных → Блядские джойны

Блядские джойны

  • sap

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

    Spritz 19 декабря 2008 г. 4:54

    Вобщем, у меня есть примерно такой запрос:

    SELECT
    T.`quote_id`, T.`content`, T.`author`, T.`source`, T.`year`,
    TA.`name` AS `author_name`,
    TK.`word_id`, TK.`keyword`,
    FROM `quotes` AS T
    JOIN `authors` AS TA
    ON T.`author` = TA.`id`
    JOIN `keywords_to_quotes` AS TT
    ON T.`quote_id` = TT.`quote_id`
    JOIN `keywords` AS TK
    ON TT.`word_id` = TK.`word_id`
    WHERE T.`quote_id`={$this->id}


    Как можно догадаться, он вытягивает данные по цитате, включая автора (авторы хранятся в отдельной таблице, в таблице квот только айди) и кейворды (типа теги, структура стандартная).

    Еще есть таблица избранных цитат пользователя (`favorites`) со структурой | id | user_id | quote_id |

    Вопрос следующий: как нужно изменить этот запрос, чтобы при получении данных было поле, говорящее о том, включена ли данная цитата в список избранных у юзера.

    Если делать тупо так:

    SELECT
    T.`quote_id`, T.`content`, T.`author`, T.`source`, T.`year`,
    TA.`name` AS `author_name`,
    TK.`word_id`, TK.`keyword`,
    TF.`id`
    FROM `quotes` AS T
    JOIN `authors` AS TA
    ON T.`author` = TA.`id`
    JOIN `keywords_to_quotes` AS TT
    ON T.`quote_id` = TT.`quote_id`
    JOIN `keywords` AS TK
    ON TT.`word_id` = TK.`word_id`
    JOIN `favorites` AS TF
    ON T.`quote_id` = TF.`quote_id`
    WHERE T.`quote_id`={$this->id}


    то при отсутствии данных в таблице избранных вообще будет пустая строка.
  • sap

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

    Spritz 19 декабря 2008 г. 5:01, спустя 7 минут 16 секунд

    Как подсказал мне disc, надо юзать в данном случае LEFT JOIN :) Проблема решена.
  • adw0rd

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

    Spritz 19 декабря 2008 г. 5:07, спустя 5 минут 49 секунд

    sap, не стал фантазировать на тему структуры твоих таблиц… Из это вопрос, знаешь что такое LEFT JOIN? :-)

    p.s. пока писал, уже не надо :-) http://www.codinghorror.com/blog/archives/000976.html
    adw/0
  • sap

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

    Spritz 19 декабря 2008 г. 5:26, спустя 18 минут 33 секунды

    Оказалось, это еще не все :)

    В `favorites` же могут быть данные к одной цитате по нескольким юзерам, а вытягиваться будет только одно… Как сделать, чтобы все?
  • adw0rd

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

    Spritz 19 декабря 2008 г. 5:28, спустя 2 минуты 42 секунды

    sap, а ты пробывал с джоинами играть?
    adw/0
  • sap

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

    Spritz 19 декабря 2008 г. 5:35, спустя 6 минут 16 секунд

    Да попробовал. Все равно только один айди возвращается.
    Сейчас запрос выглядит так:
    $this->db->sqlQuery('SELECT T.`quote_id`, T.`content`, T.`author`, T.`source`, T.`year_or_age`,
                       TA.`name` AS `author_name`,
                       TK.`word_id`, TK.`keyword`,
                       TF.`user_id` AS `favorites`
                       FROM `'.APPROVED_QUOTES_TABLE.'` AS T
                       JOIN `'.AUTHORS_TABLE.'` AS TA
                       ON T.`author` = TA.`id`
                       JOIN `'.KEYWORDS_TO_QUOTES_TABLE.'` AS TT
                       ON T.`quote_id` = TT.`quote_id`
                       JOIN `'.KEYWORDS_TABLE.'` AS TK
                       ON TT.`word_id` = TK.`word_id`
                       LEFT JOIN `'.FAVORITES_TABLE.'` AS TF
                       ON T.`quote_id` = TF.`quote_id`
                       WHERE T.`quote_id`="'.$this->id.'"');
  • md5

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

    Spritz 19 декабря 2008 г. 5:36, спустя 1 минуту 39 секунд

    как мне не нравятся константы твои )
    все умрут, а я изумруд
  • sap

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

    Spritz 19 декабря 2008 г. 5:37, спустя 1 минуту 19 секунд

    md5, чем?
  • md5

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

    Spritz 19 декабря 2008 г. 5:40, спустя 2 минуты 44 секунды


    md5, чем?
    смотрится как гавно
    на самом деле, фиг с ним с константами, ты бы их просто назвал по-человечески, например TABLE_FAVOURIES, TABLE_TRATATA, TABLE_SAP….
    все умрут, а я изумруд
  • adw0rd

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

    Spritz 19 декабря 2008 г. 5:46, спустя 5 минут 37 секунд

    Использование глобальных констант повсеместно - плохой тон!
    adw/0
  • sap

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

    Spritz 19 декабря 2008 г. 5:48, спустя 1 минуту 57 секунд

    Да хер с ними, скажите, что с запросом делать, а то у меня уже мелькает подлая мысль сделать это двумя запросами :)
  • adw0rd

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

    Spritz 19 декабря 2008 г. 5:52, спустя 4 минуты 33 секунды

    sap, а райты пробывал?
    adw/0
  • sap

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

    Spritz 19 декабря 2008 г. 5:54, спустя 1 минуту 18 секунд

    adw0rd, да, и INNER тоже, и LEFT OUTER тоже. А на FULL OUTER вообще еррор.
  • adw0rd

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

    Spritz 19 декабря 2008 г. 6:01, спустя 7 минут 7 секунд

    Примерно опиши структуру, или дай дамп, сам поиграю
    adw/0
  • sap

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

    Spritz 19 декабря 2008 г. 6:11, спустя 10 минут 36 секунд

    adw0rd, дамп задействованных таблиц с данными в аттаче.

    Дамп удален.

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