GROUP_CONCAT 内的 ORDER BY 和加入 table 的 GROUP BY

ORDER BY within GROUP_CONCAT and GROUP BY with a joined table

场景:

我有三个 table。一个 table 用于 供应商 ,另一个用于 类别 ,最后一个是 索引器 table.

每个供应商都可以选择将在索引器中注册的多个类别table。

indexer_table上的parent_id字段是注册供应商id和child_id是注册分类的id。还有一个字段叫is_main,用来检查是不是供应商的主分类

我正在处理这个查询并且效果很好。

SELECT 
    t1.id, t1.name, t1.company, t1.description,
    t2.categories, t2.categories_id 
        FROM supplier_table t1 
        LEFT JOIN (
            SELECT 
                tin2.parent_id, tin2.child_id, tin2.is_main,  
                GROUP_CONCAT(tin1.id) AS categories_id, 
                GROUP_CONCAT(tin1.title) AS categories FROM 
                (SELECT id, title FROM table_categories WHERE status = 1) tin1 
                    JOIN table_indexer tin2 ON tin2.child_id = tin1.id GROUP BY tin2.parent_id 
        ) t2 ON t1.id = t2.parent_id  
            WHERE t1.id IN (:id)

基本上,此查询 returns 我需要从供应商处获得的所有信息。类别的 ID 和名称在 categories[=31 上 concatenated =]categories_id 字段,它由供应商 ID (parent_id) 分组,给我这个输出:

Supplier Object
(
    [id] => 1
    [name] => Supplier Name
    [company] => SUpplier Company Name
    [description] => Supplier Description Text.
    [categories] => Category Example 1,Main Category,Category Example 2
    [categories_id] => 6,9,5
)

我需要的是 ORDER BY is_main DESCGROUP_CONCAT的内容。这样我就知道第一次出现的是供应商的主类

Supplier Object
(
    [id] => 1
    [name] => Supplier Name
    [company] => SUpplier Company Name
    [description] => Supplier Description Text.
    [categories] => Main Category,Category Example 1,Category Example 2
    [categories_id] => 9,6,5
)

我尝试将 ORDER BY 放在 GROUP BY 之后和其他一些地方,但没有成功。任何帮助将不胜感激,谢谢。

如果我理解你,你想要 Group_Concat 结果的内容排序,而不是它们所在的行。为此,你需要将顺序添加为 Group_Concat 的一部分. Manual here.

所以不用

GROUP_CONCAT(tin1.title) AS categories

你想要

GROUP_CONCAT(tin1.title ORDER BY tin2.is_main DESC) AS categories

如果您希望 ids concat 与标题 concat 的顺序相同,您需要对两个 concat 设置相同的排序顺序,并确保它们给出有保证的顺序,可能通过扩展排序顺序包括 ID,像这样

GROUP_CONCAT(tin1.id ORDER BY tin2.is_main DESC, Tin2.ID) AS categories_id,
GROUP_CONCAT(tin1.title ORDER BY tin2.is_main DESC, Tin2.ID) AS categories

你可以使用标题作为第二顺序,只要你能保证标题总是不同的。