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
你可以使用标题作为第二顺序,只要你能保证标题总是不同的。
场景:
我有三个 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
你可以使用标题作为第二顺序,只要你能保证标题总是不同的。