mysql - 如何在单个 SQL 查询中搜索列中的值并获取列的计数

标签 mysql sql database relational-database query-optimization

我在 MySQL 5.7 中有一个具有以下结构的表:

CREATE TABLE `post_like` (
  `post_title_id` varchar(255) NOT NULL,
  `user_name` varchar(50) NOT NULL,
  PRIMARY KEY (`post_title_id`,`user_name`),
) ENGINE=InnoDB;

我有以下数据

post_title_id    user_name

new-story        mani27
new-story        manipal
some-story       manipal

我正在尝试获取特定故事的点赞数,以及特定用户是否喜欢函数中的故事 likeStatus(user_name, post_title_id)

假设 likeStatus(mani27, new-story) 会导致:

count    status
2        1

我现在正在使用以下查询,它工作正常:

SELECT COUNT(user_name) AS count,
COUNT(CASE WHEN `user_name` = ? THEN 1 ELSE null END) as status
FROM post_like WHERE post_title_id = ?

但这会在表中的所有行上执行 case 函数,而不是搜索索引列 user_name。

我可以使用两个不同的查询来获取喜欢帖子的用户名的计数和状态,但这会花费比这更多的时间。那么,有没有一种优化的方法来获得这个输出?

最佳答案

我没有检查查询,但这应该会给您一个想法。尝试分组依据

SELECT COUNT(user_name) AS count,
COUNT(CASE WHEN `user_name` = ? THEN 1 ELSE null END) as status
FROM post_like GROUP BY post_title_id HAVING post_title_id=?

But this would execute the case function on all the rows in the table rather than searching the indexed column user_name

当您根据 post_title_id= 进行分组,然后对其应用计数函数时,用户名的行搜索数量可以减少到该组中的行

关于mysql - 如何在单个 SQL 查询中搜索列中的值并获取列的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48703759/

相关文章:

数据库设计关系代数查询

mysql - 我需要从其他数据库加入表,有时还需要从其他服务器加入表

php - 插入MySQL "on duplicate key update"语法错误

mysql - SQL:如何搜索具有最新日期和 amount_used 中最多值的数据?

php - 错误: I want remove <option selected =""></option> tag,从数据库获取记录时自动添加

mysql - 在 MySQL 数据库列中将比率存储为数字

sql - ORA-01843 : not a valid month : TO_DATE ('12-JUN-02' ,'DD-MON-YY' )

php - 通过 PHP 以编程方式备份​​(和通过电子邮件发送)完整的 MySQL 数据库

mysql - SQL 设计决策 : Should I merge these tables?

MySQL - 在一个语句中从查询更新表字段