Локальная переменная внутри инструкции mysql

#mysql

#mysql

Вопрос:

Я пытаюсь выяснить, возможно ли использовать локальную переменную внутри оператора mysql.

У меня есть оператор, который выглядит примерно так (были отфильтрованы несвязанные поля, объединения и условия):

 SELECT
  m.id,
  IF (!m.subscribers_only OR m.user_id = ? OR !ISNULL(mu.media_id) OR !ISNULL(us.user_id), 1, 0) AS has_access
FROM media m
LEFT JOIN media_user mu ON mu.user_id = ? AND m.id = mu.media_id
LEFT JOIN user_subscriptions us ON us.user_id = ? AND m.user_id = us.user_subscriber_to_id
 

Все 3 переменные являются одной и той же переменной, поэтому вместо того, чтобы привязывать параметр 3 раза, можно ли установить локальную переменную в операторе и выполнить только 1 привязку.

Я рассматривал возможность использования SET @current_user = 1 , а затем использования @current_user , но поскольку я использую PDO, невозможно выполнить два оператора в одном запросе, и я беспокоюсь о том, как происходит взаимодействие в сочетании с балансировщиком нагрузки.

Отредактируйте, чтобы показать, как я печатаю @paramter_test:

 SELECT
  m.id,
  @parameter_test,
  IF (!m.subscribers_only OR m.user_id = @parameter_test OR !ISNULL(mu.media_id) OR !ISNULL(us.user_id), 1, 0) AS has_access
  FROM media m
JOIN (SELECT @parameter_test:= 1) a
LEFT JOIN media_user mu ON mu.user_id = @parameter_test AND m.id = mu.media_id
LEFT JOIN user_subscriptions us ON us.user_id = @parameter_test AND m.user_id = us.user_subscriber_to_id
 

Комментарии:

1. !m.subscribers — и что это дает?

2. m.subscribers — это поле tinyint, поэтому оно возвращает true или false

3. ну, одна часть, кажется us.user_id = mu.user_id , такова, что удаляет одно повторение, аналогично, если это правда, то mu.user_id = m.user_id удаляет и второе повторение?

4. Я тоже так считал, но это не работает, так как mu.user_id находится в левом соединении и будет нулевым, если левое соединение не будет успешным

Ответ №1:

Попробуйте что-то вроде:

 SELECT
m.id,
IF (!m.subscribers_only OR m.user_id = @parameter_test OR !ISNULL(mu.media_id) OR 
!ISNULL(us.user_id), 1, 0) AS has_access
FROM media m
JOIN (SELECT @parameter_test:= 1) a
LEFT JOIN media_user mu ON mu.user_id = @parameter_test AND m.id = mu.media_id
LEFT JOIN user_subscriptions us ON us.user_id = @parameter_test AND m.user_id = 
us.user_subscriber_to_id
 

Вы всегда можете создать переменную внутри инструкции sql, если она объявлена до ее использования.

В этом случае вы не будете использовать заполнитель? поскольку они заменяются параметром.

Комментарии:

1. Пожалуйста, отредактируйте свой ответ и объясните, куда будет помещен заполнитель ? для установки значения локальной переменной

2. Кажется, это работает для двух параметров в ЛЕВЫХ СОЕДИНЕНИЯХ, но если я попытаюсь напечатать параметр в IF, значение там равно NULL. Я попытался установить ее в качестве первого значения в SELECT, но она по-прежнему недоступна в IF

3. Не могли бы вы привести пример того, как вы его печатаете? параметр также должен быть доступен в разделе выбора.

4. Я был неправ. Я не использовал:=, а только = . Ее изменение заставило ее работать. Спасибо