0

我遇到了一个问题,甚至可能是 MySQL 的限制。

情况如下:

我有一个 SP X,根据 1 个或 2 个参数选择相关记录。SP 返回 0、1 或多个 id 的列表。我想在 IN 子句中使用该列表,如下所示:

SELECT
    *
FROM
    table
WHERE
    id IN (spX(y));

这给了我一个错误:

Syntax error or access violation: 1305 FUNCTION z.spX does not exist

该错误有点模糊:我相信这是语法错误,而不是访问冲突或 SP 本身不存在。如果我直接调用 SP,我会得到预期的结果。

这种感觉有点像死胡同。我的期望是,如果 SP 返回超过 1,而不是返回超过 1,MySQL 会抛出错误(在这种情况下,我可以使用 FUNCTION 代替,这将立即起作用)。

所以,问题是:有没有办法在 IN 子句中使用 SP 的结果?

附带说明:我知道我可以通过简单地加入表来获得相同的结果,然后将新的 where 子句添加到现有查询中,而不是使用 SP。然而,这里真正的问题是必须将新功能添加到应用程序中,并且不必加入大量查询,而是使用 SP 是阻力最小的方式。

4

2 回答 2

0
 SELECT * FROM table WHERE id IN(SELECT spX FROM table WHERE y = ???);

您需要在括号中添加一个 select 语句,否则您将不清楚您在做什么。

如果 sPx 是您的表的名称,而 y 是您要从中提取的变量,那么您需要用括号中的 select 语句说明这一点。Def只是一个语法错误

于 2012-06-22T12:46:30.447 回答
0

我实施了聊天中提出的解决方案:

https://chat.stackoverflow.com/rooms/12910/discussion-between-robin-vg-and-hituptony

我一步一步做的事情:

  1. 我在涉及的每个查询中都放置了一个占位符。
  2. 在我的应用程序的更高级别上,我调用存储过程。澄清一下:关于 SP,我肯定知道两件事:
  • 它总是以 1 个 id 作为参数。
  • 它总是会返回 0 个或多个 id。
  1. 我根据 SP 的结果生成 IN() 子句。
  2. 我用生成的 IN() 子句替换占位符并运行我的查询。

这样我就可以随时添加或更改 SP 本身的条件,而无需更改应用程序逻辑/查询。

于 2012-06-25T09:56:17.027 回答