我想在执行这个查询时
SELECT tabla1.campo1
From tabla1, tabla2
Where tabla1.campo1 = tabla2.campo1
Group By tabla1.campo1;
例如,这会给我 600 条记录,将 600 条记录保存在一个数组中,以便以后在另一个查询中使用数组的索引(从 1 到 600)作为比较,因为我必须使用数组和 for 循环,但我已经调查过,没有找到一个明确的例子,我想知道以下几点:
它可以做我想要的吗?
资源效率高吗?
有没有更好的方法?
虽然 MySQL 没有数据类型
ARRAY
,但我认为您想要的是稍后使用查询的结果,而不必一遍又一遍地编写它。这是可能的:您可以将结果保存在临时表中,并根据需要多次使用它:现在,如果您需要为每条记录分配一个数字,您可以使用用户变量:
请记住:临时表仅对创建它们的连接可见,并在创建它们的连接关闭后被销毁。
更新
如您所见,我没有使用存储过程来生成您需要的表,而是动态生成您需要的行号。
它是如何工作的?
在子句中
FROM
,我包括您的两个表和一个子查询(我称之为init
)来初始化变量@n
。请记住,在 SQL 中,“执行顺序”是:FROM
:服务器检查数据源是否存在并且可以读取;此外,还建立了所需的关系WHERE
:相关过滤器应用于数据源GROUP BY
: 数据分组SELECT
:读取字段并计算表达式(包括聚合表达式HAVING
:相关过滤器在分组后应用于数据因此,利用执行的第一件事是 的事实
FROM
,我将变量初始化查询 (init
) 放在那里。该变量@n
被初始化为零,每次SELECT
读取一行时,它都会更新 的值@n
,将其加 1。最后,通过创建一个临时表,您可以保证每次运行查询时不会更新行号(因为您没有对值进行排序,所以不能保证会遵守行的顺序)。
运行上述查询后,您只需从新创建的表中选择所有行即可使用这些值:
现在我看到您没有使用任何聚合函数;我认为使用起来更容易
SELECT DISTINCT
:为什么“即时”比使用程序更好?
如果您想尝试存储过程,请考虑以下事项:
AUTO_INCREMENT
在表定义中使用一个值,但您希望该过程存储该数字)对于密钥的经济性,您应该“即时”生成值。另一方面,通过使用临时变量“即时”生成值,实际上并没有给服务器太多额外的工作。