ФорумРазработкаБазы данных → многие ко многим

многие ко многим

  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 10:46, спустя 14 минут 45 секунд

    БД - не мой конек.

    Есть у нас стандартная схема many to many

    entries
    id, title

    categories
    id, title

    entries2categories
    entry_id, category_id


    и вот я хочу сделать такую структуру:
    [
     {id : 1, title : 'entry 1', categories : [
       {id : 1, title : 'category 1'},
       {id : 3, title : 'category 3'}
     ]},
     {id : 2, title : 'entry 2', categories : [
       {id : 2, title : 'category 2'},
       {id : 3, title : 'category 3'}
     ]}
    ]


    и как же ж это сделать правильно?

    1) я выбираю все нужные записи из entries, к джоиню таблицу entries2categories, а к ней джоиню categories
    получаю кучу дублирующихся записей и пыхом прохожусь по ним, отсеивая дубликаты (на самом деле помещаю их в подмассив категорий)

    2) я выбираю все нужные записи из entries, беру их айдишники и привожу к виду @A = "1, 2, 3". Делаю запрос из таблицы entries2categories join categories где entry_id IN (@A).

    3) запросы в цикле. Проще простого, но если записей много - будет лажа. Кеширование обязательно

    4) какие-то еще способы?

    как правильно?
  • phpdude

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

    Spritz 25 апреля 2010 г. 1:35, спустя 14 часов 49 минут 6 секунд

    с точки зрения линейности и простоты кода я бы выбрал 1. обычно его и выбираю
    Сапожник без сапог
  • adw0rd

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

    Spritz 25 апреля 2010 г. 2:00, спустя 25 минут 23 секунды

    При первом не понимаю зачем ты пыхом уникализируешь… почему не средствами mysql?
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • phpdude

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

    Spritz 25 апреля 2010 г. 2:03, спустя 2 минуты 33 секунды


    При первом не понимаю зачем ты пыхом уникализируешь… почему не средствами mysql?
    ну тут я его понимаю так, что ему надо массив полноценных записей бд, а не например одних названий, если одних названий то да, можно пройтись по ним через http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 2:09, спустя 6 минут 25 секунд

    из таблицы с категориями нужно выбрать id, title, slug, … . Да и какой SEPARATOR выбирать? запятую? А если запятая упоминается в title?

    phpdude, ок, ну а допустим, что кроме категорий у записи есть теги. Тоже многие ко многим. Заебусь/запутаюсь уникализировать)
    Спустя 11 сек.
    оппа, 1024
  • phpdude

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

    Spritz 25 апреля 2010 г. 2:13, спустя 3 минуты 25 секунд

    Абырвалг, увы в результатах мускуля не может приходить array, а ты так этого хочешь :))))

    если есть больше одного один-комногим я бы юзал 2
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 2:16, спустя 3 минуты 37 секунд


    Абырвалг, увы в результатах мускуля не может приходить array, а ты так этого хочешь :))))


    та да. Я догадывался, что так нельзя, но до последнего надеялся на то, что "чего-то не знаю и это возможно"
    Спустя 36 сек.
    вот для таких случаев ORM в самый раз имхо. Сама приведет к удобной структуре
  • phpdude

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

    Spritz 25 апреля 2010 г. 2:19, спустя 3 минуты 9 секунд

    Абырвалг, тут да, удобно
    Сапожник без сапог
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 9:51, спустя 7 часов 31 минуту 58 секунд

    ну я могу сказать, что вот например у меня есть в блоге статьи и теги, у статьи есть теги, у тега есть статьи. Вот показывается на странице у меня 6 статей - это ровно семь запросов. Для списка статей и для тегов каждой. Всё - вопрос решен!
    )))
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 25 апреля 2010 г. 10:06, спустя 14 минут 8 секунд

    kostyl, это решается двумя (ну возможно тремя) запросами (достать все статьи *возможно ещё и теги для этих статей* для страницы и достать все статьи для всех тегов на странице) и обработкой полученных данных.
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 10:14, спустя 8 минут 42 секунды

    да, кстати, интересно как в разных ORM это сделано. Может в некоторых реализациях тоже запросы в цикле?)
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 10:31, спустя 16 минут 49 секунд


    kostyl, это решается двумя (ну возможно тремя) запросами (достать все статьи *возможно ещё и теги для этих статей* для страницы и достать все статьи для всех тегов на странице) и обработкой полученных данных.

    конечно решается, я просто показал еще один вариант
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 10:46, спустя 15 минут 4 секунды

    ок, обновил шапку с запросами в цикле
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 25 апреля 2010 г. 13:28, спустя 2 часа 42 минуты 4 секунды

    Я для пыхи киношку когда делал то такую реализацию для вывода фильмов делал.

    выводим несколько фильмов и для каждого жанры к которым он принадлежит

    /**
    * возвращаем фильмы этого жанра
    * @param $genres номер жанра
    * @param $start номер страницы
    * @param $count - количество фильмов
    */
    function getMuviesGenres($genres,$start,$count=10)
    {
    $res=$this->db->query("SELECT
    `film_movies`.*
    FROM
    `film_movies`
    JOIN `film_genre_movies`
    ON `film_movies`.`id`=`film_genre_movies`.`moviesID`
    WHERE
    `film_genre_movies`.`genreID`=?i
    LIMIT ?i,?i",array($genres,$start*$count,$count));


    while($row=mysqli_fetch_assoc($res))
    {
    $muvies[]=$row;
    $muviesID[]=$row['id'];
    }
    if(is_array($muviesID)){
    $genres=$this->db->query("SELECT
    `film_genre`.*,
    `film_genre_movies`.`moviesID` as `moviesID`
    FROM
    `film_genre`
    JOIN `film_genre_movies`
    ON `film_genre`.`id`=`film_genre_movies`.`genreID`
    WHERE
    `film_genre_movies`.`moviesID` IN (?ai)",array($muviesID));

    while($row=mysqli_fetch_assoc($genres))
    {
    $genr[$row['moviesID']][]=$row;
    }


    return array("muvi" => $muvies,
    "genres" => $genr);
    }
    else
    {
    return false;
    }
    }


    тоесть 2 запроса и небольшая работа с массивами. и того список фильмов и у каждого свои жанры =)
  • phpdude

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

    Spritz 25 апреля 2010 г. 13:31, спустя 2 минуты 45 секунд

    Professor, англичанин нах

    muvies = movies …. аж передернуло
    Спустя 16 сек.
    бля там ошибок как говна вообще)) забей на мой пост
    Спустя 16 сек.
    зря убрал кнопку "ХУЙНЯ"
    Сапожник без сапог

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