Php 合并来自2个SQL结果的数组

Php 合并来自2个SQL结果的数组,php,sql,codeigniter,multidimensional-array,Php,Sql,Codeigniter,Multidimensional Array,因此,我在SQL中设置了一个标记表 列表,列表\u标记,标记 每个列表可以有多个标记,标记有两种类型:流派和制作人。现在,如果我们正在寻找所有带有标签“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_i

因此,我在SQL中设置了一个标记表

列表,列表\u标记,标记

每个列表可以有多个标记,标记有两种类型:流派和制作人。现在,如果我们正在寻找所有带有标签“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'  
这将返回列表ID的数组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] => 
        )

)
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
        )

)
然后我们得到标签

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
            [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] => 
        )

)
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
                    )

            )

)

谢谢你的建议,我真的迷路了。如果有比这更好的解决方案,我洗耳恭听。

您可以执行另一种类型的联接,该联接将返回与每个子对象合并多次的父项,如下所示:

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查询)的过程密集度要低。

多亏了这一点,你知道如何在php中“合并结果”吗?最简单的方法可能是创建两个数组,一个是片段,一个是类型。循环上面查询中的每一行,从该行创建一个新的插曲对象,并将其添加到插曲数组中。然后在这个循环中,循环现有类型的数组(开始时为空)。如果第二个数组中没有一个类型与行中的类型匹配,请创建一个新类型并将其添加到该数组中。然后将当前插曲对象的流派属性指定给流派对象(创建的新对象或匹配的现有对象)您可以将流派添加到第二个数组中,并根据其id编制索引,而不只是将其推到末尾。然后,您只需查看是否存在通过索引匹配id的现有类型对象。