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

How do I search for a value in a column and also get count of the column in a single SQL query

我在 MySQL 5.7 中有一个 table 以下结构:

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 = ?

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

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

将条件添加到 CASE 而不是 WHERE,然后确保使用 DISTINCT 以避免重复:

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

我没有检查查询,但这应该能让您有所了解。尝试按

分组
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= 进行分组,然后对其应用计数函数时,用户名的行搜索数可以减少到该组中的行数

您不必扫描所有记录来查看用户是否喜欢post。只需在 select 列表上使用子查询。那应该使用主键索引。 这样的东西应该可以工作

SELECT COUNT(*), 
    (SELECT COUNT(*) FROM post_like WHERE postid=? AND userid=?)
WHERE postid=?