我有以下SQL查询
SELECT id,
title,
total_likes,
IFNULL(SELECT 1 FROM 'likedata' WHERE user_id=$UID AND post_id=posts.id)0) AS is_liked
FROM 'posts'
我想创建mysql函数,使我的查询位更短,
我不知道如何将第二个查询包装到sql函数中并传递2个变量($ UID和$ PID)来使函数更简短,更易理解。
任何帮助都会很棒,提前谢谢
这不是一个功能的好用例。
在SQL中更流畅的表达方式是使用左外连接,例如:
SELECT posts.id, posts.title, posts.total_likes,
(likedata.id IS NOT NULL) AS is_liked
FROM posts
LEFT JOIN likedata ON (
posts.id = likedata.post_id AND likedata.user_id = $UID
)
你实际上可以简单地使用exists
。 MySQL将布尔值视为数字,因此:
SELECT p.id, p.title, p.total_likes,
( EXISTS (SELECT 1 FROM likedata ld WHERE ld.post_id = p.id AND ld.user_id = $UID)
) as is_liked
FROM posts p;
这似乎与您原来的意图最接近。
@ duskwuff的回答也是解决这个问题的典型方法。有一点不同,因为likedata
中的重复项会导致使用join
在结果集中出现重复行。
对于任何一种形式,您需要likedata(post_id, user_id)
上的索引。如果你传入$UID
,你应该使用参数化查询。