GROUP_CONCAT和GROUP BY中的ORDER BY(具有联接表)

时间:2018-11-21 16:34:23

标签: mysql join group-by sql-order-by group-concat

场景:

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

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

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

基本上,此查询从供应商处返回我需要的所有信息。类别的ID和名称分别在 categories categories_id 字段上 concatenated 并按供应商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 DESC GROUP_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 之后以及其他一些地方,但这没用。任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

如果我理解您的要求,那么您希望将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上放置相同的排序顺序,并确保它们给出有保证的顺序,可能是通过扩展排序顺序以使其包括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

您可以使用标题作为第二顺序,只要可以保证标题始终是不同的即可。