У меня есть три таблицы для определения пользователей:
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 должно быть быстрее для выполнения этого внешнего запроса каждый раз, верно?