#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. Я был неправ. Я не использовал:=, а только = . Ее изменение заставило ее работать. Спасибо