Mysql 链接SQL查询

Mysql 链接SQL查询,mysql,sql,Mysql,Sql,现在我在跑步 SELECT formula('FOO') FROM table1 WHERE table1.foo = 'FOO' && table1.bar = 'BAR'; 但是我不想在常量FOO上运行它,而是在查询中的每个值上运行它 SELECT foos FROM table2 WHERE table2.bar = 'BAR'; 我该怎么做 编辑:重要更改:在函数的参数中添加了FOO 说明: SELECT foo FROM table1 WHERE foo = 'FO

现在我在跑步

SELECT formula('FOO') FROM table1
WHERE table1.foo = 'FOO' && table1.bar = 'BAR';
但是我不想在常量
FOO
上运行它,而是在查询中的每个值上运行它

SELECT foos FROM table2
WHERE table2.bar = 'BAR';
我该怎么做

编辑:重要更改:在函数的参数中添加了FOO

说明:

SELECT foo FROM table1 WHERE foo = 'FOO' && table1.bar = 'BAR';
给出一个包含FOOa、FOOb、FOOc的列

SELECT formula('FOO') FROM table1
WHERE table1.foo = 'FOO' && table1.bar = 'BAR';
给出一个条目,比如sum(FOO)(实际上要复杂得多,但它在某些时候使用聚合来组合结果)

我想要一个查询,它给出一个包含sum(FOO1)、sum(FOO2)的列。。。其中每个FOOn的计算方式与FOO类似。但我希望使用一个查询而不是n个查询来实现这一点(因为n可能很大,而且在任何情况下,FOOn的特定值都会因情况而异)。

尝试:

SELECT formula FROM table1, table2
WHERE table1.foo = table2.foo AND table1.bar = table2.bar;
试试这个:

SELECT formula FROM table1
WHERE table1.foo IN(SELECT foos FROM table2
WHERE table2.bar = 'BAR';
) AND table1.bar = 'BAR';
编辑:

这还没有经过测试,但也许会奏效

SELECT formula(q1.foo) FROM table1 INNER JOIN (SELECT foo, bar FROM table2) q1 ON table1.foo = q1.foo WHERE table1.bar = 'BAR';
您必须使用。
其工作方式是使用参数将SQL语句串在一起

您需要小心,但不要允许用户提供该数据,因为转义不能防止SQL注入。您需要对照白名单检查每个列名

下面是存储过程中的示例代码

其工作方式是,您有一个具有列名的(临时)表,存储过程将其构建到查询中:

dynamic  /*holds variable parts of an SQL statement
-----------
id integer PK
column_name varchar(255)
operation ENUM('what','from','where','group by','having','order by','limit')
function_name varchar(255)  /*function desc with a '@' placeholder where  */
                            /* the column-name goes  */

whitelist /*holds all allowed column names*/
-----------
id integer PK
allowed varchar(255)  /*allowed column of table name*/
item ENUM('column','table')
动态SQL存储过程。需要预填充两个表:
dynamic
whitelist

DELIMITER $$

CREATE PROCEDURE dynamic_example;
BEGIN
  DECLARE vwhat VARCHAR(65000);
  DECLARE vfrom VARCHAR(65000);
  DECLARE vwhere VARCHAR(65000);
  DECLARE vQuery VARCHAR(65000);

  SELECT group_concat(REPLACE(function_name,'@',column_name)) INTO vwhat 
    FROM dynamic
    INNER JOIN whitelist wl ON (wl.allowed LIKE column_name 
                                AND wl.item = 'column') 
    WHERE operation = 'what' AND  
  SELECT group_concat(REPLACE(function_name,'@',column_name)) INTO vfrom 
    FROM dynamic 
    INNER JOIN whitelist wl ON (wl.allowed LIKE column_name
                                AND wl.item = 'table')  
    WHERE operation = 'from';
  SELECT group_concat(REPLACE(function_name,'@',column_name)) INTO vwhere
    FROM dynamic 
    INNER JOIN whitelist wl ON (wl.allowed LIKE column_name
                                AND wl.item = 'column')  
    WHERE operation = 'where';
  IF vwhat IS NULL THEN SET vwhat = ' * ';
  IF vwhere IS NOT NULL THEN SET vwhere = CONCAT(' WHERE ',vwhere); END IF;

  SET vQuery = CONCAT(' SELECT ',vwhat,' FROM ',vfrom,IFNULL(vwhere,''));
  PREPARE dSQL FROM vQuery;
  EXECUTE dSQL;
  DEALLOCATE PREPARE dSQL;     
END $$

DELIMITER ;

你想对第二次查询的每个结果都运行第一次查询吗?@Ivan Korytin:我想要一个包含公式('FOO1')、公式('FOO2')、…、公式('FOOn')的表。我想我对此还不清楚……如果你执行此查询
从表1中选择foo,其中foo='foo'和bar='bar'然后您将得到一列,标题为“foo”,每行包含“foo”,因为这是您在WHERE子句中选择的内容。所以在你上面发布的例子中,FOOa=FOOb=FOOc。您是在寻找按
条分组的总和吗?@Travesty3:实际上它也使用未显示的列。我想我已经明白了,不过。。。这是一个分组问题。对不起,我忘记了问题的一个主要部分:公式涉及FOO。这个可以修改吗?你能详细说明一下吗?我不知道你的意思。原来问题是两张桌子之间的分组。。。我应该从我对聚合的使用中猜到这一点。抱歉给你添麻烦了。
DELIMITER $$

CREATE PROCEDURE dynamic_example;
BEGIN
  DECLARE vwhat VARCHAR(65000);
  DECLARE vfrom VARCHAR(65000);
  DECLARE vwhere VARCHAR(65000);
  DECLARE vQuery VARCHAR(65000);

  SELECT group_concat(REPLACE(function_name,'@',column_name)) INTO vwhat 
    FROM dynamic
    INNER JOIN whitelist wl ON (wl.allowed LIKE column_name 
                                AND wl.item = 'column') 
    WHERE operation = 'what' AND  
  SELECT group_concat(REPLACE(function_name,'@',column_name)) INTO vfrom 
    FROM dynamic 
    INNER JOIN whitelist wl ON (wl.allowed LIKE column_name
                                AND wl.item = 'table')  
    WHERE operation = 'from';
  SELECT group_concat(REPLACE(function_name,'@',column_name)) INTO vwhere
    FROM dynamic 
    INNER JOIN whitelist wl ON (wl.allowed LIKE column_name
                                AND wl.item = 'column')  
    WHERE operation = 'where';
  IF vwhat IS NULL THEN SET vwhat = ' * ';
  IF vwhere IS NOT NULL THEN SET vwhere = CONCAT(' WHERE ',vwhere); END IF;

  SET vQuery = CONCAT(' SELECT ',vwhat,' FROM ',vfrom,IFNULL(vwhere,''));
  PREPARE dSQL FROM vQuery;
  EXECUTE dSQL;
  DEALLOCATE PREPARE dSQL;     
END $$

DELIMITER ;