繁体   English   中英

从查询中选择不同的值,但不包括排序目的列

[英]Select distinct values from query excluding sorting-purpose column

描述:

我要选择网站内容的类别。 它们中的大多数将由用户创建,因此我将不得不处理表中许多类别的问题。 我想尊重我网站上某种内容的趋势。 我的解决方案是:

  • 选择过去2天的所有类别,然后按出现次数(升序)排序,
  • 联合查询(不同)
  • 从日期<过去2天中选择所有类别,然后像上面一样对其进行排序。

多亏了它,我才拥有了少量时间中所有最受欢迎的类别+全球范围内最受欢迎的类别。

查询:

(SELECT category, COUNT(*) AS number FROM data WHERE date BETWEEN ADDDATE(NOW(), INTERVAL -2 DAY) AND NOW() GROUP BY category)
UNION  
(SELECT category, COUNT(*) AS number FROM data WHERE date < ADDDATE(NOW(), INTERVAL -2 DAY) GROUP BY category)
ORDER BY number DESC LIMIT 50

输出:

+----------+--------+
| category | number |
+----------+--------+
|        2 |      3 |
|        4 |      3 |
|        6 |      3 |
|        5 |      2 |
|        1 |      2 |
|        2 |      1 |
+----------+--------+
6 rows in set (0.00 sec)

请注意,类别(id 2)中存在重复的内容,UNION DISTINCT(默认值)不排除此内容,因为它会比较两列中的行,因此:

+----------+--------+
| category | number |
+----------+--------+
|        2 |      3 | //is not equal to
|        2 |      1 | //below values
+----------+--------+
//wont be excluded

要解决的问题:

我只需要从category列中选择不同的值

number仅用于排序目的,仅在此查询中使用)

如果我正确理解了您的问题,那么应该是您需要的查询:

SELECT category
FROM (
  SELECT category, COUNT(*) AS number
  FROM data WHERE date BETWEEN ADDDATE(NOW(), INTERVAL -2 DAY) AND NOW()
  GROUP BY category
  UNION ALL
  SELECT category, COUNT(*) AS number
  FROM data WHERE date < ADDDATE(NOW(), INTERVAL -2 DAY)
  GROUP BY category
  ORDER BY number DESC
) s
GROUP BY category
ORDER BY MAX(number) DESC
LIMIT 50

我删除了构成联合查询的两个查询周围的方括号(),因为UNION查询的ORDER BY将同时应用于这两个查询。 我还使用了UNION ALL而不是UNION,因为类别在外部查询中再次进行了分组,因此我会尝试使用UNION / UNION ALL来查看哪个更快。

然后,我再次按类别分组,并按类别的MAX(数字)排序,仅保留前50行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM