假设我有一个小部件数据库。我正在显示每个窗口小部件的前十个分组列表,按类别分隔。
所以我想说我想要显示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
答案 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,然后按该列排序