[英]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.