如何在列中搜索值并在单个 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=?
我在 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=?