构造Mysql查询

时间:2015-05-20 00:50:43

标签: mysql

假设我有一个名为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)必须随机选择行

1 个答案:

答案 0 :(得分:1)

Doug R的评论应该牢记在心。请始终包括您尝试过的内容。你遇到的问题各不相同,我觉得答案对你和其他人有帮助。

示例表和查询位于:http://sqlfiddle.com/#!9/3beee/6

要选择类别为1的记录,请使用以下查询。 WHERE子句有助于将您的记录过滤到仅类别1

select * from tblSchoolSupplies where categoryID = 1;

按子类别对行进行分组需要更多信息。您通常会将信息分组以获取统计信息。例如,每个子类别中有多少个项目或每个子类别属于多少个类别。请注意,我正在选择subCategoryID并对其执行GROUP BY。其他列是统计计算。大多数(如果不是全部)您将遇到的GROUP BY个查询都会有dimension个类似的子类别ID,它与sumcountavg等统计函数一起分组等

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;