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 ;