繁体   English   中英

将所有选择唯一查询合并为一个

[英]Combine all Select Distinct Queries into one

这是一个小提琴例子

我在页面上有30多个搜索过滤器(我将其称为多面搜索, 类似的例子来自Vitacost)。 在每个页面加载中,每个过滤器都会接受一个查询(现在大约有50个查询以及其他类型的查询),以根据用户的搜索结果更新过滤器选项。 我有像这样的SELECT DISTINCT查询

SELECT DISTINCT(Category) FROM `Toy` 
    WHERE (Material LIKE '%Steel%')
    AND Material <> ''
    ORDER BY Material

SELECT DISTINCT(Manufacturer) FROM `Toy` 
    WHERE (Material LIKE '%Steel%')
    AND Manufacturer <> ''
    ORDER BY Manufacturer


SELECT DISTINCT(Rating) FROM `Toy` 
    WHERE (Material LIKE '%Steel%')
    AND Rating <> ''
    ORDER BY Rating

我想知道是否有提升性能或至少减少查询的空间。 我已经尝试了JOIN但看不到任何改善,结果是错误的。 有人有任何想法或建议吗?

    SELECT * 
    FROM (

    SELECT DISTINCT(Category),Material FROM `Toy` 
        WHERE (Material LIKE '%Steel%')
        AND Material <> ''
        ORDER BY Material

    )TAB1
    JOIN (

      SELECT DISTINCT(Manufacturer),Material FROM `Toy` 
        WHERE (Material LIKE '%Steel%')
        AND Manufacturer <> ''
        ORDER BY Manufacturer
    )TAB2 ON TAB1.Material = TAB2.Material
    JOIN (
            SELECT DISTINCT(Rating),Material FROM `Toy` 
        WHERE (Material LIKE '%Steel%')
        AND Rating <> ''
        ORDER BY Rating
   )TAB3 ON TAB2.Material = TAB3.Material
GROUP BY TAB2.Material

表:

CREATE TABLE Toy
    (`Toyid` int, `Toy` varchar(20),`Category` varchar(30),`Manufacturer` varchar(3),`Rating` varchar(10),`Material` varchar(20))
;

INSERT INTO Toy
    (`Toyid`,`Toy`,`Category`,`Manufacturer`,`Rating`,`Material`)
VALUES
    (1, 'ToyA','Outdoor','AAA','5','Plastic'),
    (2, 'ToyB','Doll','AAA','5','Gold'),
    (3, 'ToyC','Brainteaser','AAA','4','Metal'),
    (4, 'ToyD','Educational','CCC','5','PVD Steel'),
    (5, 'ToyE','Outdoor','DDD','3','Plastic'),
    (6, 'ToyF','Figure','EEE','3','Steel'),
    (7, 'ToyG','Creative','TTT','2','Stainless Steel'),
    (8, 'ToyH','Doll','DDD','2','Steel'),
    (9, 'ToyI','Outdoor','TTT','5','Stainless Steel'),
    (10, 'ToyJ','Brainteaser','DDD','2','PVD GOLD'),
    (11, 'ToyK','Creative','CCC','4','Rose Gold'),
    (12, 'ToyL','Figure','KKK','2','Gold')
;

我的预期输出:

CATEGORY

Educational
Creative
Outdoor
Figure
Doll

RATING
2
3 
5

MANUFACTURER
CCC
DDD
EEE
TTT

因此,我想找到一种解决方案,将它们合并为一个输出。

您可以尝试这样的事情:-

SELECT DISTINCT Category, Material, Manufacturer, Rating
FROM Toy
WHERE Material LIKE '%Steel%'
AND  Material <> ''
AND Manufacturer <> ''
AND Rating <> ''
ORDER BY Material, Manufacturer, Rating;

这可能对您有帮助。

这是您在sqlfidle中查询(使用join)的结果:

|    CATEGORY |        MATERIAL | MANUFACTURER | RATING |
|-------------|-----------------|--------------|--------|
| Educational |       PVD Steel |          CCC |      5 |
|    Creative | Stainless Steel |          TTT |      2 |
|        Doll |           Steel |          DDD |      2 |

但是,如果您分别运行每个查询

|    CATEGORY |
|-------------|
| Educational |
|    Creative |
|     Outdoor |
|        Doll |
|      Figure |

| MANUFACTURER |
|--------------|
|          CCC |
|          DDD |
|          EEE |
|          TTT |

| RATING |
|--------|
|      2 |
|      3 |
|      5 |

分类在哪里图或户外?或等级3? ,或制造商的EEE? 在您的组合查询中? 该组合查询是错误的,并且也不提供性能提升。

通过上面的建议,您应该可以提高性能,但是请看一下结果:

|        MATERIAL |    CATEGORY | MANUFACTURER | RATING |
|-----------------|-------------|--------------|--------|
| Stainless Steel |    Creative |          TTT |      2 |
|           Steel |        Doll |          DDD |      2 |
|       PVD Steel | Educational |          CCC |      5 |
|           Steel |      Figure |          EEE |      3 |
| Stainless Steel |     Outdoor |          TTT |      5 |

尽管这些“不同”,但它们在整个行中是不同的。 因此,没有列-本身-是一个独特的列表。 因此,例如,如果使用PHP,则需要将此多列结果收集到一个数组中,然后针对每个下拉列表从中分别创建独立的数组(也许使用array_unique)。 因此,更少的DBMS工作量,但是更多的PHP工作量。


请注意, distinct不是函数,实际上是关键字select的条件,我建议您在distinct之后立即停止使用括号: SELECT DISTINCT(Category)应该只是SELECT DISTINCT Category


通常,仅在真正需要时才应使用ORDER BY ,并且如果可以避免“双端”通配符搜索,这也将有助于提高性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM