У меня есть следующий 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), чтобы сделать этот запрос короче и понятнее.
любая помощь будет большой, спасибо заранее
Вы можете просто использовать exists
. MySQL рассматривает booleans как числа, поэтому:
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
, вы должны использовать параметризованные запросы.
Это не очень удобно для функции.
Более свободный способ выразить это в 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
)