假设我有一个名为tblSchoolSupplies的表,如下所示:
itemsID categoryID subCategoryID itemName
1 1 1 pencil
2 1 1 eraser
3 2 2 toilet paper
4 1 2 bond paper
5 1 3 bag
6 1 1 ruler
7 1 2 compass
8 1 3 pencil case
9 2 2 soap
我想要做的是构建一个符合以下4个标准的查询:
1)选择categoryID = 1下的行 2)按子类别ID分组行 3)每个子类别ID限制2行 4)必须随机选择行
答案 0 :(得分:1)
示例表和查询位于:http://sqlfiddle.com/#!9/3beee/6
要选择类别为1的记录,请使用以下查询。 WHERE
子句有助于将您的记录过滤到仅类别1
select * from tblSchoolSupplies where categoryID = 1;
按子类别对行进行分组需要更多信息。您通常会将信息分组以获取统计信息。例如,每个子类别中有多少个项目或每个子类别属于多少个类别。请注意,我正在选择subCategoryID并对其执行GROUP BY
。其他列是统计计算。大多数(如果不是全部)您将遇到的GROUP BY
个查询都会有dimension
个类似的子类别ID,它与sum
,count
,avg
等统计函数一起分组等
select
subCategoryID,
count(*) as items_in_subcategory,
count(distinct categoryID) as distinct_categories
from tblSchoolSupplies
group by subCategoryID;
与第一个问题相比,每个subCategoryID限制2行更具挑战性。以下答案基于question 12113699
-- limit 2 rows per subCategoryID
set @number := 0;
set @subCategoryID := '';
select *
from
(
select *,
@number:=if(@subCategoryID = subCategoryID, @number + 1, 1) as rownum,
@subCategoryID:=subCategoryID as field1
from tblSchoolSupplies
order by subCategoryID, itemsID
) as subcat
where subcat.rownum < 3;
使用随机排序顺序并仅限制1个记录输出将为您提供随机选择的行。请仔细阅读question 4329396中的讨论,以获得对类似问题的不同看法。
select * from tblSchoolSupplies order by rand() limit 1;