У меня есть три таблицы для определения пользователей:
USER: user_id (int), username (varchar)
USER_METADATA_FIELD: user_metadata_field_id (int), field_name (varchar)
USER_METADATA: user_metadata_field_id (int), user_id (int), field_value (varchar)
Я хотел бы создать пользователя среднего уровня, который имеет определенный доступ к другим пользователям в приложении. Чтобы определить, к каким пользователям, которые вошли в систему, могут получить доступ, я использую подзапрос, как показано ниже:
SELECT user_id FROM user WHERE user_id
IN (SELECT user_id
FROM user_metadata
WHERE user_metadata_field_id = 1 AND field_value = 'foo')
В настоящее время я сохраняю строку подзапроса в переменной, а затем динамически вставляю ее во внешний запрос каждый раз, когда мне нужно вывести список пользователей. После этого я подумал: "Лучше всего просто сохранить строку фактического user_id
s".
Итак, вместо сохранения этого в переменной...
$subSql = "SELECT user_id FROM user_metadata WHERE user_metadata_field_id = 1 AND field_value = 'foo'";
... Я действительно выполняю запрос и сохраняю результат следующим образом:
$subSql = "12, 56, 89, 100, 1234, 890";
Затем, когда мне нужно вытащить освещенных пользователей, к которым имеет доступ зарегистрированный пользователь, я могу сделать это с помощью
$sql = "SELECT user_id FROM user WHERE user_id IN ($subSql)";
И, наконец, вопросы:
Сколько элементов вы можете использовать в MySQL IN
CLAUSE? Сохранение фактических идентификаторов вместо оператора sub-sql должно выполняться быстрее для выполнения этого внешнего запроса каждый раз, правильно?