Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从两个表中查找唯一id,并从两个表中查找相应的计数_Mysql_Sql_Join - Fatal编程技术网

Mysql 从两个表中查找唯一id,并从两个表中查找相应的计数

Mysql 从两个表中查找唯一id,并从两个表中查找相应的计数,mysql,sql,join,Mysql,Sql,Join,我正在运行一个mysql数据库。我有两个表分别存储帖子上的喜欢和评论 喜欢表格: +--------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+------------------+------+-----+---------

我正在运行一个mysql数据库。我有两个表分别存储帖子上的喜欢和评论

喜欢表格:

+--------------+------------------+------+-----+---------+----------------+
| Field        | Type             | Null | Key | Default | Extra          |
+--------------+------------------+------+-----+---------+----------------+
| id           | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| post_id      | int(11)          | NO   |     | NULL    |                |
| user_id      | varchar(255)     | NO   |     | NULL    |                |
| created_at   | timestamp        | YES  |     | NULL    |                |
| updated_at   | timestamp        | YES  |     | NULL    |                |
+--------------+------------------+------+-----+---------+----------------+
意见表:

+--------------+------------------+------+-----+---------+----------------+
| Field        | Type             | Null | Key | Default | Extra          |
+--------------+------------------+------+-----+---------+----------------+
| id           | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| post_id      | int(11)          | NO   |     | NULL    |                |
| user_id      | varchar(255)     | NO   |     | NULL    |                |
| comment      | varchar(255)     | NO   |     | NULL    |                |
| created_at   | timestamp        | YES  |     | NULL    |                |
| updated_at   | timestamp        | YES  |     | NULL    |                |
+--------------+------------------+------+-----+---------+----------------+
我需要得到唯一的用户ID和他们的喜好和评论计数

我运行了以下查询:

select * from
(select user_id, count(*) as like_count from post_likes group by user_id) as a,
(select user_id, count(*) as comment_count from post_comments group by user_id) as b
limit 5
两个表合计180万条记录的查询耗时66秒。而且,它没有给出正确的结果

如果我执行左连接,它只返回左表中的匹配记录,而我需要从这两个表中返回匹配记录,即如果用户id只喜欢而没有评论,或者只评论而没有喜欢

我想得到的是:

+--------------+------------------+------+-----+---------+
| user_id      | like_count       | comment_count        |
+--------------+------------------+------+-----+---------+
| 1            | 1213             | 310                  |
| 2            | 1098             | 0                    |
| 3            | 0                | 115                  |
+--------------+------------------+------+-----+---------+
改为使用UNION ALL,然后合并行:

select user_id, sum(like_count), sum(comment_count)
from
(
    select user_id, count(*) as like_count, null as comment_count
    from post_likes
    group by user_id
    union all
    select user_id, null, count(*)
    from post_comments
    group by user_id
) as dt
group by user_id
改为使用UNION ALL,然后合并行:

select user_id, sum(like_count), sum(comment_count)
from
(
    select user_id, count(*) as like_count, null as comment_count
    from post_likes
    group by user_id
    union all
    select user_id, null, count(*)
    from post_comments
    group by user_id
) as dt
group by user_id
理想的方法是将联接留在用户表上,例如:

SELECT u.user_id, COUNT(l.id), COUNT(c.id)
FROM users u LEFT JOIN Likes l ON u.user_id = l.user_id
LEFT JOIN Comments c ON u.user_id = c.user_id;
理想的方法是将联接留在用户表上,例如:

SELECT u.user_id, COUNT(l.id), COUNT(c.id)
FROM users u LEFT JOIN Likes l ON u.user_id = l.user_id
LEFT JOIN Comments c ON u.user_id = c.user_id;
一种方法是使用UNION ALL和条件聚合:

此查询不会返回没有喜好和评论的用户。

一种方法是使用UNION ALL和条件聚合:


此查询不会返回没有喜好和评论的用户。

您没有用户表吗?当然有。我还没有把它包括在连接中,因为我只需要用户ID。你没有用户表吗?当然有。我还没有把它包括在连接中,因为我只需要用户的ID。这非常有效。谢谢使用临时表测试它以替换内部查询,因为整个查询是每天只运行一次的cron的一部分。测试临时表是否可以提高查询的性能。我可以在脚本结束后删除这些表。我会发布我的发现。我们将非常感谢您的见解。再次感谢。这很有效。谢谢使用临时表测试它以替换内部查询,因为整个查询是每天只运行一次的cron的一部分。测试临时表是否可以提高查询的性能。我可以在脚本结束后删除这些表。我会发布我的发现。我们将非常感谢您的见解。再次感谢。