Select 行,其中 count() = n

Select rows where count() = n

我正在实现一个搜索功能,其中结果应显示结果页面,并且对于每个结果,主图像和最多 3 个缩略图。

现在在生产版本中,对于每个广告,它都会从数据库中获取 1 select 到 return 的图像,这对性能来说很糟糕,所以我将其更改为单个查询基本上执行以下操作:

select * from AdImages order by IsMainImage desc, AdImageId

和 return 类似于:

AdImageId   AdId        IsMainImage FilePath
----------- ----------- ----------- ----------------------------------------
1           1           1           9c513f10-5480-4e41-89c6-074b36051999.jpg
5           2           1           f64f9c12-398e-445f-9724-baebe40930b1.jpg
6           4           1           8187d566-b296-4ab0-85e5-b9fc86f293b7.jpg
8           5           1           b8165008-09b3-4258-bf54-043195138344.jpg
10          6           1           86c636ed-f4ed-4f7e-8c7e-fc0b24faa956.jpg
11          7           1           4409a3fd-2bc0-4512-9850-6f5146193e50.jpg
13          8           1           b9b66c48-92b7-479a-a85d-dc6d26b03ebc.jpg
14          9           1           9f3f06ad-4fe1-43a5-8cce-3bb804bb10b7.jpg
16          10          1           016c30dc-5ee8-40d8-9d0f-398f444d7a7b.jpg
19          11          1           e5e56602-1af7-492b-8a8e-b61ac86b751b.jpg
2           1           0           02d44ce1-0de6-4e22-b4ef-043a72e9b5e8.jpg
3           1           0           8c4e19db-faff-44c2-9aab-6a96ab2a8e22.jpg
4           1           0           d8c2464a-277c-40fa-ab43-d2455e819e7e.jpg
7           4           0           d1430ae0-df51-43b7-acea-50d606eee5ba.jpg
9           5           0           b947ae4c-653d-4c27-9edd-567d977e1af3.jpg
12          7           0           3080c947-3769-4762-bb29-f1f9c5303ecd.jpg
15          9           0           d2543ce3-1e65-4a18-80d6-584de0025f1a.jpg
17          10          0           03b26d6a-4e0c-4393-9b5a-d9f2a24d36da.jpg
18          10          0           cde5dacd-3984-4cea-b56f-c3a6c5b82fa0.jpg
20          11          0           9e286ac0-25b1-4a05-af83-26e5d0002c2a.jpg
21          11          0           b1266770-9926-462c-8ec0-e965b21021eb.jpg
22          11          0           0542bd2a-4c4b-41d4-b51b-d311f42f0da9.jpg
23          11          0           b1cc44c9-50c4-4e81-bc9a-a0a4b515e709.jpg

我的本地数据库非常小,但我可以注意到性能得到了很好的提升,无论如何,我认为如果我可以让这个查询 return 每个广告最多 4 行而不是每个广告的所有行,因为它正在做。但要这样做,它应该类似于 where count(AdId) == 4,我不确定是否可行。

我在这里也使用 Entity Framework。非常欢迎任何额外的建议。

如果我没理解错的话,你可以 return TOP xx 结果。

SELECT TOP(3) * from AdImages order by IsMainImage desc, AdImageId;

这将 return 只有前 3 个结果。

使用Window Function

select AdImageId ,AdId ,IsMainImage ,FilePath 
from(
select row_number() over(partition by Adid order by IsMainImage desc, AdImageId) rn,* 
from AdImages)a
where rn<=4