Объединить массивы из двух результатов SQL - PullRequest
0 голосов
/ 26 марта 2011

Итак, у меня есть настройки таблицы тегов в SQL

lists, lists_tags, tags

Каждый список может иметь несколько тегов, а теги имеют два типа: жанр и продюсер.Теперь, если мы ищем все списки с тегами 'action', это следующие шаги:

SELECT GROUP_CONCAT(mini_lists_tags.list_id) AS list_ids
FROM (`mini_tags`)
LEFT JOIN `mini_lists_tags` ON `mini_lists_tags`.`tag_id` = `mini_tags`.`tag_id`
WHERE `mini_tags`.`tag_slug` = 'action'  

. Это вернет массив 1,2 для идентификаторов списка.

SELECT *
FROM (`mini_lists_anime`)
JOIN `mini_lists` ON `mini_lists`.`list_id` = `mini_lists_anime`.`list_id`
WHERE `mini_lists`.`list_id` IN ('1', '2') 
AND `mini_lists`.`list_state` = 'active'

, который получает все списки в массиве ПРИМЕР:

Array
(
    [0] => stdClass Object
        (
            [list_id] => 1
            [list_episodes] => 13
            [list_duration] => 24
            [list_aired] => 1238623200
            [list_age_rate] => PG-13 - Teens 13 or older
            [user_id] => 1
            [list_mal] => 5342
            [list_category] => Anime
            [list_type] => TV
            [list_status] => Completed
            [list_title] => Asura Cryin'
            [list_alt_titles] => アスラクライン
            [list_thumb] => 17071
            [list_likes] => 0
            [list_date] => 1300609723
            [list_update] => 0
            [list_state] => active
            [list_info] => 
        )

    [1] => stdClass Object
        (
            [list_id] => 2
            [list_episodes] => 26
            [list_duration] => 23
            [list_aired] => 1238623200
            [list_age_rate] => PG-13 - Teens 13 or older
            [user_id] => 1
            [list_mal] => 329
            [list_category] => Anime
            [list_type] => TV
            [list_status] => Completed
            [list_title] => Planetes
            [list_alt_titles] => プラネテス
            [list_thumb] => 4822
            [list_likes] => 0
            [list_date] => 1300609723
            [list_update] => 0
            [list_state] => active
            [list_info] => 
        )

)

И затем мы получаем теги

SELECT `mini_lists_tags`.`list_id`, `mini_tags`.`tag_type`, GROUP_CONCAT(mini_tags.tag_name) AS tag_names
FROM (`mini_lists_tags`)
INNER JOIN `mini_tags` ON `mini_tags`.`tag_id` = `mini_lists_tags`.`tag_id`
WHERE `mini_lists_tags`.`list_id` IN ('1', '2') 
GROUP BY `mini_lists_tags`.`list_id`, `mini_tags`.`tag_type`  

, который получает все теги в массиве ПРИМЕР:

Array
(
    [0] => stdClass Object
        (
            [list_id] => 1
            [tag_type] => Genre
            [tag_names] => Supernatural,Action,Mecha
        )

    [1] => stdClass Object
        (
            [list_id] => 1
            [tag_type] => Producers
            [tag_names] => Seven Arcs
        )

    [2] => stdClass Object
        (
            [list_id] => 2
            [tag_type] => Genre
            [tag_names] => Romance,Action,Sci-fi,Comedy,Slice of Life,Drama,Space
        )

    [3] => stdClass Object
        (
            [list_id] => 2
            [tag_type] => Producers
            [tag_names] => Sunrise,Bandai Entertainment,Bandai Visual,Bang Zoom! Entertainment
        )

)

Теперь проблема в том, что мне нужно объединить их в list_id, чтобы он возвращал что-то подобное для каждого.

    stdClass Object
    (
        [list_id] => 1
        [list_episodes] => 13
        [list_duration] => 24
        [list_aired] => 1238623200
        [list_age_rate] => PG-13 - Teens 13 or older
        [user_id] => 1
        [list_mal] => 5342
        [list_category] => Anime
        [list_type] => TV
        [list_status] => Completed
        [list_title] => Asura Cryin'
        [list_alt_titles] => アスラクライン
        [list_thumb] => 17071
        [list_likes] => 0
        [list_date] => 1300609723
        [list_update] => 0
        [list_state] => active
        [list_info] => 
        [list_tags] => Array
            (
                [0] => stdClass Object
                    (
                        [tag_type] => Genre
                        [tag_names] => Mecha,Action,Supernatural
                    )

                [1] => stdClass Object
                    (
                        [tag_type] => Producers
                        [tag_names] => Seven Arcs
                    )

            )

)

Любой совет приветствуется, я действительно потерян.если есть лучшее решение, чем это, я весь слух.

1 Ответ

0 голосов
/ 28 марта 2011

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

Array(
   [0] => stdClass Object
    (
        [list_id] => 1
        [list_episodes] => 13
        [list_duration] => 24
        ...etc
        [tag_type] => Genre
        [tag_names] => Supernatural,Action,Mecha
        ...etc
    )
   [1] => stdClass Object
    (
        [list_id] => 1
        [list_episodes] => 13
        [list_duration] => 24
        ...etc
        [tag_type] => Producers
        [tag_names] => Seven Arcs
        ...etc
    )
   [2] => stdClass Object
    (
        [list_id] => 2
        [list_episodes] => 26
        [list_duration] => 23
        ...etc
        [tag_type] => Genre
        [tag_names] => Supernatural,Action,Mecha
        ...etc
    )
   [3] => stdClass Object
    (
        [list_id] => 2
        [list_episodes] => 26
        [list_duration] => 23
        ...etc
        [tag_type] => Producers
        [tag_names] => Seven Arcs
        ...etc
    )
)

Затем вам нужно будет просмотреть свои результаты, объединив результаты в их дочерние / родительские отношения. Это связано с тем, что SQL всегда возвращает строки как результаты, а не сложные структуры.

Хотя с этим сложнее справиться, обычно он менее трудоемок, чем выполнение зацикленных SQL-запросов для каждого родительского объекта (так называемых n + 1 запросов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...