我有以下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)来使函数更简短,更容易理解。
任何帮助都会很棒,提前谢谢
答案 0 :(得分:0)
这不是一个功能的好用例。
在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
)
答案 1 :(得分:0)
您实际上可以简单地使用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
,则应该使用参数化查询。