场景:
我有三个桌子。一个表用于供应商,另一个表用于类别,最后一个表是索引器表。
每个供应商都可以选择将在索引器表中注册的多个类别。
在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 之后以及其他一些地方,但这没用。任何帮助将不胜感激,谢谢。
答案 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
您可以使用标题作为第二顺序,只要可以保证标题始终是不同的即可。