我将如何在MySQL中执行此操作?

时间:2010-04-21 18:48:32

标签: mysql

假设我有一个小部件数据库。我正在显示每个窗口小部件的前十个分组列表,按类别分隔。

所以我想说我想要显示A类中所有小部件的列表,但我想根据该类别中小部件的总数对它们进行排序,并且只显示前10个分组。

所以,我的列表可能看起来像这样。

A类中的热门分组

1990年由公司1制作的100个小部件 1993年由公司1制作的90个小工具。
1993年由公司3制作的70个小工具。
等...(10组)

这一部分很容易,但现在可以说我希望某些分组总是出现在列表中,即使它实际上没有进入前十名。

让我们说我总是希望显示2009年公司1制作的小部件数量,但我希望这个分组随机显示在我的列表中(不是第一个或最后一个)

所以结束列表应该类似于

A类中的热门分组

1990年由公司1制作的100个小部件 1993年由公司1制作的90个小工具。
2009年由公司1制作的30个小部件。
1993年由公司3制作的70件小工具。

我将如何在MySQL中实现这一目标?

感谢

编辑:

目前,我的查询看起来像这样

        SELECT
            year, 
            manufacturer,
            MAX(price) AS price,
            image_url,
            COUNT(id) AS total
        FROM 
            widgets
        WHERE
            category_id = A
        AND
            year <> ''
        AND
            manufacturer <> ''
        GROUP BY  
            category_id,
            manufacturer,
            year
        ORDER BY  
            total DESC,
            price ASC
        LIMIT 
            10
    );

那里没有强制性的分组。

展示位置不一定是随机的,只是不应该在任何极端。列表应该是10个分组,包括强制列表。所以9 + 1

3 个答案:

答案 0 :(得分:1)

我会使用UNION查询:您当前的查询联合2009年的查询,然后处理表示层中的排序。

答案 1 :(得分:0)

您可以编写2个单独的查询(一个用于所有公司,另一个用于公司1),然后使用UNION将它们连接在一起。最后,添加ORDER BY RAND()。    它看起来像

SELECT * FROM
(
   SELECT company_id, company_name, year, count(*)  as num_widgets 
   .... 
   LIMIT 10
   UNION DISTINCT
   SELECT company_id, company_name, year, count(*)  as num_widgets 
   ...
   WHERE company_id =1      
   ...
   LIMIT 10
)x
ORDER BY RAND();

答案 2 :(得分:0)

您可以在2009年添加一个您对公司1生效的字段,并将其包含在where子句中。像

这样的东西

select * from companies where group = 'some group' or included = true order by included, widgets_made limit 10

对于随机部分,您将其作为子查询,然后包含一个列,如果您创建的字段为true,则具有1到10的随机数,否则为rownum,然后按该列排序