2

我的表看起来像这样(这只是一个例子):

id    name    title    time
----------------------------
1     name1   title1   1000
2     name1   title1   1001
3     name1   title1   1002
4     name2   title2   1003
5     name2   title2   1004
6     name3   title3   1005
7     name4   title4   1006
8     name4   title4   1007
9     name4   title4   1008
10    name4   title4   1009

我想编写一个 SQL 语句来选择每个名称的计数以及与之相关的信息。时间实际上是一个 UNIX 时间戳,但我只是为了简化这个问题而进行了更改。

// This is will get me the trending posts for only the last minute
$time_in_past = time() - 60;
$mysqli->query(
    "SELECT COUNT(`id`) FROM `trending`........WHERE `time` < '$time_in_past'"
);

我希望while()在 PHP 中获取 with 语句后的结果是这样的:

name: name4 count: 4 title: title4
name: name1 count: 3 title: title1
name: name2 count: 2 title: title2
name: name3 count: 1 title: title3

我希望它们按每个的 COUNT 排序,同时仍然得到 10 个结果(在这个例子中只有 4 个)。

4

2 回答 2

4

您需要将结果分组(按名称),然后再次将结果加入您的表格:

SELECT * FROM trending NATURAL JOIN (
  SELECT   name, COUNT(*) AS cnt
  FROM     trending
  WHERE    time < ?
  GROUP BY name
) t
WHERE    time < ?
ORDER BY t.cnt DESC
于 2013-05-05T09:11:47.990 回答
2

看起来你可以摆脱一个简单的GROUP BY,像这样:

SELECT name, COUNT(*), title
FROM trending
GROUP BY name, title
ORDER BY COUNT(*) DESC;

由于您的nametitle外观永远不会有所不同,因此将它们分组在一起不会给您更多的行。order byDESC以相反的顺序为您提供计数。

于 2013-05-05T09:12:43.073 回答