Select每个关系的最高记录
Select the highest record of each relation
我需要获取所有用户访问次数最多的站点
我有以下表格:
页数:
id link_page
1 link 1
2 link 2
3 Link 3
用户:
id name
1 Joseph
2 Cris
3 Byram
pages_user:
user_id page_id
1 1
1 1
1 1
2 1
2 1
2 2
应该得到以下内容:
user_id | most visited page id
1 1
2 1
到目前为止我做了这样的事情:
SELECT count(pu.page_id) as counter, pu.user_id
FROM page_user pu
INNER JOIN page p on p.id = pu.page_id
INNER JOIN users u on u.id = pu.user_id
GROUP BY pu.user_id, pu.page_id
ORDER BY counter DESC
但是我return所有的记录。
因为我可以获得所有用户中访问次数最多的网站?
来自智利的问候。
SELECT id, (SELECT page_id FROM page_user
WHERE user_id = id GROUP BY page_id
ORDER BY COUNT(page_id) DESC LIMIT 1) FROM USER
试试这个查询。您可以修改以显示所有必填字段
编辑:要查看命中数,请使用以下查询。
SELECT id, (SELECT page_id FROM page_user
WHERE user_id = id GROUP BY page_id
ORDER BY COUNT(page_id) DESC LIMIT 1) page_id, (SELECT COUNT(page_id) cnt FROM page_user
WHERE user_id = id GROUP BY page_id
ORDER BY cnt DESC LIMIT 1) cnt FROM USER
这是一种方法,请考虑以下内容
mysql> select * from user;
+------+--------+
| id | name |
+------+--------+
| 1 | Joseph |
| 2 | Cris |
| 3 | Byam |
+------+--------+
3 rows in set (0.00 sec)
mysql> select * from page;
+------+-----------+
| id | link_page |
+------+-----------+
| 1 | link 1 |
| 2 | link 2 |
| 3 | link 3 |
+------+-----------+
3 rows in set (0.00 sec)
+---------+---------+
| user_id | page_id |
+---------+---------+
| 1 | 1 |
| 1 | 1 |
| 1 | 1 |
| 2 | 1 |
| 2 | 1 |
| 2 | 2 |
| 3 | 2 |
| 3 | 2 |
| 3 | 2 |
| 3 | 1 |
| 3 | 3 |
| 3 | 3 |
+---------+---------+
12 rows in set (0.00 sec)
select
u.id as user_id,
p.id as `most visited page id`
from user u join (
select count(*) as cnt,user_id,page_id from pages_user group by user_id,page_id
)x on x.user_id = u.id
left join(
select count(*) as cnt,user_id,page_id from pages_user group by user_id,page_id
)y on x.user_id = y.user_id and y.cnt > x.cnt
join page p on p.id = x.page_id
where y.user_id is null ;
+---------+----------------------+
| user_id | most visited page id |
+---------+----------------------+
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
+---------+----------------------+
你可以试试这个:
SELECT
t.user_id,
t.page_id AS most_visited_page_id
FROM (
SELECT
pu.user_id,
pu.page_id,
COUNT(*) AS visitCount
FROM page_user pu
INNER JOIN page p ON p.id = pu.page_id
INNER JOIN user u ON u.id = pu.user_id
GROUP BY pu.user_id, pu.page_id
ORDER BY pu.user_id, visitCount DESC, rand() <-- In case of multiple
page with same count it will give random page or you can check
it with most recent visit with date if any -->
) AS t
GROUP BY t.user_id
这里是 sqlfiddle.
我需要获取所有用户访问次数最多的站点
我有以下表格:
页数:
id link_page
1 link 1
2 link 2
3 Link 3
用户:
id name
1 Joseph
2 Cris
3 Byram
pages_user:
user_id page_id
1 1
1 1
1 1
2 1
2 1
2 2
应该得到以下内容:
user_id | most visited page id
1 1
2 1
到目前为止我做了这样的事情:
SELECT count(pu.page_id) as counter, pu.user_id
FROM page_user pu
INNER JOIN page p on p.id = pu.page_id
INNER JOIN users u on u.id = pu.user_id
GROUP BY pu.user_id, pu.page_id
ORDER BY counter DESC
但是我return所有的记录。
因为我可以获得所有用户中访问次数最多的网站?
来自智利的问候。
SELECT id, (SELECT page_id FROM page_user
WHERE user_id = id GROUP BY page_id
ORDER BY COUNT(page_id) DESC LIMIT 1) FROM USER
试试这个查询。您可以修改以显示所有必填字段
编辑:要查看命中数,请使用以下查询。
SELECT id, (SELECT page_id FROM page_user
WHERE user_id = id GROUP BY page_id
ORDER BY COUNT(page_id) DESC LIMIT 1) page_id, (SELECT COUNT(page_id) cnt FROM page_user
WHERE user_id = id GROUP BY page_id
ORDER BY cnt DESC LIMIT 1) cnt FROM USER
这是一种方法,请考虑以下内容
mysql> select * from user;
+------+--------+
| id | name |
+------+--------+
| 1 | Joseph |
| 2 | Cris |
| 3 | Byam |
+------+--------+
3 rows in set (0.00 sec)
mysql> select * from page;
+------+-----------+
| id | link_page |
+------+-----------+
| 1 | link 1 |
| 2 | link 2 |
| 3 | link 3 |
+------+-----------+
3 rows in set (0.00 sec)
+---------+---------+
| user_id | page_id |
+---------+---------+
| 1 | 1 |
| 1 | 1 |
| 1 | 1 |
| 2 | 1 |
| 2 | 1 |
| 2 | 2 |
| 3 | 2 |
| 3 | 2 |
| 3 | 2 |
| 3 | 1 |
| 3 | 3 |
| 3 | 3 |
+---------+---------+
12 rows in set (0.00 sec)
select
u.id as user_id,
p.id as `most visited page id`
from user u join (
select count(*) as cnt,user_id,page_id from pages_user group by user_id,page_id
)x on x.user_id = u.id
left join(
select count(*) as cnt,user_id,page_id from pages_user group by user_id,page_id
)y on x.user_id = y.user_id and y.cnt > x.cnt
join page p on p.id = x.page_id
where y.user_id is null ;
+---------+----------------------+
| user_id | most visited page id |
+---------+----------------------+
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
+---------+----------------------+
你可以试试这个:
SELECT
t.user_id,
t.page_id AS most_visited_page_id
FROM (
SELECT
pu.user_id,
pu.page_id,
COUNT(*) AS visitCount
FROM page_user pu
INNER JOIN page p ON p.id = pu.page_id
INNER JOIN user u ON u.id = pu.user_id
GROUP BY pu.user_id, pu.page_id
ORDER BY pu.user_id, visitCount DESC, rand() <-- In case of multiple
page with same count it will give random page or you can check
it with most recent visit with date if any -->
) AS t
GROUP BY t.user_id
这里是 sqlfiddle.