Mysql 使用SQL中的特定标记查找最活跃的用户

Mysql 使用SQL中的特定标记查找最活跃的用户,mysql,sql,Mysql,Sql,这是一个用户可以上传图片并在描述中使用标签的网站。我想找出谁是最活跃的用户张贴图片使用特定的标签在过去10天 $q2 = $db->prepare('SELECT * FROM cards_tags JOIN cards ON cards_tags.card_id = cards.id JOIN users ON cards.user_id = users.id

这是一个用户可以上传图片并在描述中使用标签的网站。我想找出谁是最活跃的用户张贴图片使用特定的标签在过去10天

$q2 = $db->prepare('SELECT *
                    FROM cards_tags
                    JOIN cards ON cards_tags.card_id = cards.id
                    JOIN users ON cards.user_id = users.id
                    WHERE cards_tags.date_time > DATE_SUB(CURDATE(), INTERVAL 10 DAY)
                    AND cards_tags.tag_id = :tag_id');
$q2->execute([':tag_id' => $tag->id()]);

while($data = $q2->fetch()) 
{
    echo $data['user'].' posts with the tag id : '.$tag->id().'<br>';
}
以下是表格:

卡片(帖子)

卡片\u标签

+----+---------+--------+---------------------+
| id | card_id | tag_id |      date_time      |
+----+---------+--------+---------------------+
|  1 |       1 |      1 | 2020-01-25 12:46:00 |
|  2 |       1 |      2 | 2020-01-24 13:26:00 |
|  3 |       1 |      3 | 2020-01-23 14:46:00 |
|  4 |       2 |      1 | 2020-01-22 15:51:00 |
|  5 |       2 |      3 | 2020-01-21 12:52:00 |
+----+---------+--------+---------------------+
+----+---------+-------+
| id |  name   | ect.. |
+----+---------+-------+
|  1 | bush    |       |
|  2 | clinton |       |
|  3 | obama   |       |
|  4 | trump   |       |
|  5 | reagan  |       |
+----+---------+-------+
用户

+----+---------+--------+---------------------+
| id | card_id | tag_id |      date_time      |
+----+---------+--------+---------------------+
|  1 |       1 |      1 | 2020-01-25 12:46:00 |
|  2 |       1 |      2 | 2020-01-24 13:26:00 |
|  3 |       1 |      3 | 2020-01-23 14:46:00 |
|  4 |       2 |      1 | 2020-01-22 15:51:00 |
|  5 |       2 |      3 | 2020-01-21 12:52:00 |
+----+---------+--------+---------------------+
+----+---------+-------+
| id |  name   | ect.. |
+----+---------+-------+
|  1 | bush    |       |
|  2 | clinton |       |
|  3 | obama   |       |
|  4 | trump   |       |
|  5 | reagan  |       |
+----+---------+-------+
我得到了这个SQL查询,它提供了过去10天使用特定标记的用户列表

$q2 = $db->prepare('SELECT *
                    FROM cards_tags
                    JOIN cards ON cards_tags.card_id = cards.id
                    JOIN users ON cards.user_id = users.id
                    WHERE cards_tags.date_time > DATE_SUB(CURDATE(), INTERVAL 10 DAY)
                    AND cards_tags.tag_id = :tag_id');
$q2->execute([':tag_id' => $tag->id()]);

while($data = $q2->fetch()) 
{
    echo $data['user'].' posts with the tag id : '.$tag->id().'<br>';
}
$q2=$db->prepare('SELECT')*
从卡片到标签
在卡片上加入卡片\u标签。卡片\u id=卡片.id
加入卡上的用户。user\u id=users.id
其中cards_tags.date_time>date_SUB(CURDATE(),间隔10天)
和卡片_tags.tag_id=:tag_id');
$q2->execute([':tag_id'=>$tag->id());
而($data=$q2->fetch())
{
echo$data['user'].'posts的标记id为:'.$tag->id();
}
但是,我想知道用户在过去10天内使用特定标签的次数,并按用户ID对其进行分组

这是我到目前为止提出的,但它不起作用:

$q2 = $db->prepare('SELECT *, COUNT(users.id) AS occurrence
                    FROM cards_tags
                    JOIN cards ON cards_tags.card_id = cards.id
                    JOIN users ON cards.user_id = users.id
                    WHERE cards_tags.date_time > DATE_SUB(CURDATE(), INTERVAL 10 DAY)
                    AND cards_tags.tag_id = :tag_id
                    GROUP BY users.id');
$q2->execute([':tag_id' => $tag->id()]);

while($data = $q2->fetch()) 
{
    echo $data['user'].' is trending with '.$data['occurrence'].' posts with the tag id : '.$tag->id().'<br>';
}
$q2=$db->prepare('SELECT*,将(users.id)计数为事件
从卡片到标签
在卡片上加入卡片\u标签。卡片\u id=卡片.id
加入卡上的用户。user\u id=users.id
其中cards_tags.date_time>date_SUB(CURDATE(),间隔10天)
和卡片\u tags.tag\u id=:tag\u id
按用户分组。id');
$q2->execute([':tag_id'=>$tag->id());
而($data=$q2->fetch())
{
echo$data['user'].'正在以“$data['occurrence']”为趋势。使用标记id:“.$tag->id()”。
”; }
使用以下查询,可能会对您有所帮助:

选择cards\u tags.tag\u id,计数(users.id)作为发生次数 从卡片到标签 在卡片上加入卡片\u标签。卡片\u id=卡片.id 加入卡上的用户。user\u id=users.id 其中cards_tags.date_time>date_SUB(CURDATE(),间隔10天) 和卡片\u tags.tag\u id=:tag\u id 按用户分组。id')

“不工作”是什么意思?如果仅从
用户
中选择列,则查询应该可以:

SELECT u.*, COUNT(*) AS occurrence
FROM cards_tags ct JOIN
     cards c
     ON ct.card_id = c.id JOIN
     users u
     ON c.user_id = u.id
WHERE ct.date_time > DATE_SUB(CURDATE(), INTERVAL 10 DAY) AND
     ct.tag_id = :tag_id
GROUP BY u.id
ORDER BY occurrence DESC;

我添加了一个
排序依据
,以便与您的问题更为一致。

您通常
分组依据
选择
相同的列,但那些是设置函数的参数的列除外。我想您可能希望
选择卡片_tags.tag\u id,计数(users.id)作为出现次数。。。按卡分组\u标签。标签\u id