groupconcat中的order by和带有联接表的group by

syqv5f0l  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(389)

脚本:
我有三张table。一个表用于供应商,另一个表用于类别,最后一个表是索引表。
每个供应商都可以选择将在索引器表中注册的多个类别。
indexer\u表上的字段parent\u id用于注册供应商的id,而child\u id用于注册类别的id。还有另一个名为is\ u 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\u id字段中,并按供应商id(parent\u 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
)

我需要的是按主描述组的内容。这样,我就知道第一次出现是供应商的主要类别。

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
)

我试着在一个又一个的小组和其他一些地方下订单,但没有成功。任何帮助都将不胜感激,谢谢。

ttcibm8c

ttcibm8c1#

如果我理解您的意思,您希望对组\u concat结果的内容进行排序,而不是它们所在的行。为此,您需要将订单添加为组concat的一部分。这里是手册。
所以

GROUP_CONCAT(tin1.title) AS categories

你想要这样的东西吗

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

如果希望ids concat与title one的顺序相同,则需要在两个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

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

相关问题