英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论