0

我有以下 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)传递给函数以使该查询更短且更易于理解。

任何帮助都会很棒,在此先感谢

4

2 回答 2

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,你应该使用参数化查询。

于 2018-05-27T12:36:51.420 回答
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
)

你可以在这里看到这个。

于 2018-05-27T08:17:56.797 回答