Как создать функцию MySQL

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), чтобы сделать этот запрос короче и понятнее.

любая помощь будет большой, спасибо заранее

  • 0
    Почему 'Table1' строка? Аналогично для 'table2'?
  • 0
    извините, это должно быть имя таблицы, я довольно новичок в SQL, пожалуйста, простите меня
Показать ещё 1 комментарий
Теги:
function

2 ответа

0

Вы можете просто использовать 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, вы должны использовать параметризованные запросы.

  • 0
    Спасибо за усилия, но я хочу сделать это с помощью функций, потому что я знаю, что в будущем мне нужно изменить запрос, поэтому с функцией mysql это будет намного проще сделать. Можете ли вы предоставить помощь с функцией?
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
)

Вы можете увидеть это в действии здесь.

  • 0
    спасибо за ответ, но что если у меня несколько данных и таблиц, в этом случае запрос станет очень длинным, я хочу заключить его в функцию, чтобы сделать его более управляемым.
  • 0
    @PurgeProject Тогда вы стискиваете зубы и пишете длинный запрос. Опять же: это не хороший вариант использования функций.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню