![](/img/trans.png)
[英]Excluding column from MySQL SELECT distinct query with UNION across tables
[英]Select distinct values from query excluding sorting-purpose column
我要选择网站内容的类别。 它们中的大多数将由用户创建,因此我将不得不处理表中许多类别的问题。 我想尊重我网站上某种内容的趋势。 我的解决方案是:
多亏了它,我才拥有了少量时间中所有最受欢迎的类别+全球范围内最受欢迎的类别。
(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.