【发布时间】:2018-07-20 02:26:19
【问题描述】:
我在 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。
我可以使用两个不同的查询来获取用户名喜欢帖子的计数和状态,但这需要更多的时间。那么,有没有一种优化的方式来获得这个输出呢?
【问题讨论】:
-
您使用的是哪个 DBMS? SQL 只是一种语言。
-
@MBijen 我在本地环境中使用 MariaDB,但它将部署在 MySQL 5.7.17 中
-
短:
SUM(user_name = ?)但是...你真的想要一个大于 1 的值作为“状态”吗? -
另见
GROUP BY。 -
谢谢@RickJames。我已经更改了 SUM(user_name = ?) 并且不,我不希望状态值更大,但这是我能想到的最好的值。
标签: mysql sql database relational-database query-optimization