我有三个表来定义用户:
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中可以使用多少个项目?每次执行该外部查询时,必须存储实际的id而不是sub-sql语句,对吗?
从一定数量开始,IN
表速度更快。
MySQL
在其代码内部包含一些内容,这使得在大量常量值上构建范围比在嵌套循环中进行计算要慢。
有关性能的详细信息,请参见我的博客中的这篇文章:
问题内容: 我有一个数据库,其中有四列对应于开始和结束位置的地理坐标x,y。这些列是: 00 00 x1 11 我有这四个列的索引,其顺序为x0,y0,x1,y1。 我列出了大约一百种地理对组合。我将如何有效地查询此数据? 我想按照此SO答案的建议执行类似的操作,但它仅适用于Oracle数据库,不适用于MySQL: 我以为可能对索引做些什么?最好的方法是什么(即:最快的查询)?谢谢你的帮助! 笔记
问题内容: 可以在SQL IN子句中放置1000多个项目吗?我们一直在遇到无法处理Oracle数据库的问题。 如果是的话,我们如何在SQL IN子句中放置1000多个项目? 如果没有,我还能做什么? 问题答案: 您应该将IN子句转换为INNER JOIN子句。 您可以像这样转换查询 在另一个查询中 您还将获得很多性能
问题内容: 将SQL IN子句与的实例一起使用的最佳解决方法是什么,由于SQL注入攻击安全性问题,多个值不支持该子句:一个占位符代表一个值,而不是值列表。 考虑以下SQL语句: 使用本质上是一种不可行的尝试,它是首先解决使用原因的方法?。 有哪些解决方法? 问题答案: 建议的选项是: 准备,对每个值执行它,并在客户端对结果进行UNION。只需要一个准备好的语句。缓慢而痛苦。 准备并执行它。每个IN
问题内容: 我的一个表中有一列,其中存储多个用逗号分隔的ID。有没有一种方法可以在查询的“ IN”子句中使用此列的值。 column()的值类似于 我需要用作 我对Crozin的回答感到满意,但我愿意接受建议,观点和选择。 随时分享您的观点。 问题答案: 以@Jeremy Smith的FIND_IN_SET()示例为基础,您可以使用联接来完成此操作,因此不必运行子查询。 这是众所周知的非常表现
问题内容: 结合使用子句和实例的最佳解决方法是什么,由于注入攻击安全性问题,多个值不支持该子句:一个?占位符代表一个值,而不是值列表。 考虑以下SQL语句: 使用;本质上是一种不可行的尝试,它是首先解决使用原因的解决方法?。 有哪些解决方法? 问题答案: 建议的选项是: 准备,对每个值执行它,并在客户端对结果进行。只需要一个准备好的语句。缓慢而痛苦。 准备并执行它。每个大小需要一个准备好的语句。快
本文向大家介绍MySQL XOR运算符与IN子句?,包括了MySQL XOR运算符与IN子句?的使用技巧和注意事项,需要的朋友参考一下 如果一个或另一个操作数(或表达式)但不是两个都为TRUE,则MySQL XOR返回TRUE。IN子句用于指定任何其他MySQL查询的条件。 让我们先创建一个表 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 输出结果 这将产生以下输出-