英文:
How can I sort deduplicated mySQL data by multiple fields ignoring nulls?
问题
我试图按正确的顺序获取经siteId去重的类别列表。
数据如下:
类别
=============
类别ID,
siteId,
父类别ID,
标题,
激活
这是我的当前查询:
选择
parentTitle,
childTitle,
subChildTitle,
从 (
选择 subChild.categoryId as parentCategoryId,
child.categoryId as childCategoryId,
parent.categoryId as subChildCategoryId,
subChild.title as subChildTitle,
child.title as childTitle,
parent.title as parentTitle
从 类别 subChild
左加入 类别 child on child.categoryId = subChild.parentId
左加入 类别 parent on parent.categoryId = child.parentId
其中 subChild.siteId 在 (1,2,3)
和 subChild.active = 'Y'
) 作为类别
按 parentTitle, childTitle, subChildTitle 分组
按 COALESCE(parentTitle, childTitle, subChildTitle) 排序;
我得到的结果如下:
NULL NULL 家电
NULL 家电 洗碗机
NULL 家电 干衣机
家电 洗碗机 不正确清洗
家电 干衣机 不正确清洗
我想要的是这个:
NULL NULL 家电
NULL 家电 洗碗机
家电 洗碗机 不正确清洗
NULL 家电 干衣机
家电 干衣机 不正确清洗
更好的是这样:(但只要正确排序就可以)
家电 NULL NULL
家电 洗碗机 NULL
家电 洗碗机 不正确清洗
家电 干衣机 NULL
家电 干衣机 不正确清洗
英文:
I'm trying to get a list of categories, de-duplicated by siteId in the correct order.
Data looks like this:
categories
=============
categoryId,
siteId,
parentId,
title,
active
Here is my current query:
SELECT
parentTitle,
childTitle,
subChildTitle,
from (
select subChild.categoryId as parentCategoryId,
child.categoryId as childCategoryId,
parent.categoryId as subChildCategoryId,
subChild.title as subChildTitle,
child.title as childTitle,
parent.title as parentTitle
from categories subChild
left join categories child on child.categoryId = subChild.parentId
left join categories parent on parent.categoryId = child.parentId
where subChild.siteId in (1,2,3)
and subChild.active = 'Y'
) as categories
group by parentTitle, childTitle, subChildTitle
order by COALESCE(parentTitle, childTitle, subChildTitle);
I get back results like this:
NULL NULL Appliance
NULL Appliance Dishwasher
NULL Appliance Dryer
Appliance Dishwasher Not Cleaning Correctly
Appliance Dryer Not Cleaning
What i want is this:
NULL NULL Appliance
NULL Appliance Dishwasher
Appliance Dishwasher Not Cleaning Correctly
NULL Appliance Dryer
Appliance Dryer Not Cleaning
even better would be this: (but i'm fine with it just sorting correct above)
Appliance NULL NULL
Appliance Dishwasher NULL
Appliance Dishwasher Not Cleaning Correctly
Appliance Dryer NULL
Appliance Dryer Not Cleaning
答案1
得分: 1
以下是翻译好的SQL查询部分:
SELECT
parentTitle,
childTitle,
subChildTitle
FROM (
SELECT
COALESCE(parent.title, child.title, subChild.title) AS parentTitle,
CASE
WHEN parent.title IS NULL AND child.title IS NULL THEN NULL
WHEN parent.title IS NULL THEN subChild.title
ELSE child.title
END AS childTitle,
CASE
WHEN parent.title IS NOT NULL AND child.title IS NOT NULL THEN subChild.title
END AS subChildTitle
FROM categories subChild
LEFT JOIN categories child on child.categoryId = subChild.parentId
LEFT JOIN categories parent on parent.categoryId = child.parentId
WHERE subChild.siteId IN (1, 2, 3)
AND subChild.active = 'Y'
) AS c
GROUP BY parentTitle, childTitle, subChildTitle
ORDER BY parentTitle, childTitle, subChildTitle;
请注意,我已经排除了代码部分,只提供了SQL查询的翻译。
英文:
How about this approach which is just reordering the columns a bit:
SELECT
parentTitle,
childTitle,
subChildTitle
FROM (
SELECT
COALESCE(parent.title, child.title, subChild.title) AS parentTitle,
CASE
WHEN parent.title IS NULL AND child.title IS NULL THEN NULL
WHEN parent.title IS NULL THEN subChild.title
ELSE child.title
END AS childTitle,
CASE
WHEN parent.title IS NOT NULL AND child.title IS NOT NULL THEN subChild.title
END AS subChildTitle
FROM categories subChild
LEFT JOIN categories child on child.categoryId = subChild.parentId
LEFT JOIN categories parent on parent.categoryId = child.parentId
WHERE subChild.siteId IN (1, 2, 3)
AND subChild.active = 'Y'
) AS c
GROUP BY parentTitle, childTitle, subChildTitle
ORDER BY parentTitle, childTitle, subChildTitle;
Given the following as source data:
categoryId | siteId | parentId | title | active |
---|---|---|---|---|
1 | 1 | NULL | Appliance | Y |
2 | 1 | 1 | Dishwasher | Y |
3 | 1 | 1 | Dryer | Y |
4 | 1 | 2 | Not Cleaning Correctly | Y |
5 | 1 | 3 | Not Cleaning | Y |
6 | 2 | NULL | Appliance | Y |
7 | 2 | 6 | Dishwasher | Y |
8 | 2 | 6 | Dryer | Y |
9 | 2 | 7 | Not Cleaning Correctly | Y |
10 | 2 | 8 | Not Cleaning | Y |
11 | 3 | NULL | Appliance | Y |
12 | 3 | 11 | Dishwasher | Y |
13 | 3 | 11 | Dryer | Y |
14 | 3 | 12 | Not Cleaning Correctly | Y |
15 | 3 | 13 | Not Cleaning | Y |
The query returns:
parentTitle | childTitle | subChildTitle |
---|---|---|
Appliance | NULL | NULL |
Appliance | Dishwasher | NULL |
Appliance | Dishwasher | Not Cleaning Correctly |
Appliance | Dryer | NULL |
Appliance | Dryer | Not Cleaning |
We cannot be sure how your client application is using this data, but it is worth having a read through this blog post, which may help you look at your adjacency list differently.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论