我无法轻易更改数据库架构/设计,因此我需要以下情况的帮助。
每个对象都有一行,它有自己唯一的ID(匹配表主键 - 保证最多只能有一行)。
id (int; prim key),field1 (int), field2 (int), ...... (int), fieldn (int)
我想做SELECT * FROM table WHERE id = 1 AND ANY_FIELD < 1
之类的事情。显然,这不存在。该行包含较少的列(几十个 - 因此我根本无法轻松完成WHERE field1 < 1 Or field2 < 1 OR ...
。)
我想过做SELECT * FROM (DESC table A) WHERE A.Field.Value < 1
之类的事情(。但不存在.Value。)
我只想要一个查询(对子查询很好)。
它现在的工作原理是它扫描每一列并手动检查,非常慢。
感谢您的帮助。
答案 0 :(得分:0)
我担心这是不可能的。您可以动态构造一个包含所有列的预准备语句,然后执行该语句。但是在单个查询中无法实现。您必须创建动态语句,然后执行它。
答案 1 :(得分:0)
远照:您可以从信息模式中获取所有字段名称,以便对所有行进行求和(请参阅this random google hit)。如果您减去ID
,则总共需要查找所有行。
这会让你关闭,但仍然是0 + 0 + 3仍然是3,所以你不能只检查总行数是否大于SUM - &gt;你需要自己在这个查询中添加一些检查以解决这个问题,但我相信这可能是可行的。 (要么只检查&lt; 0行并添加那些,或某种形式的IF计数&gt; 1为1)
如果链接消失:这是该论坛中添加所有整数行的查询。
SET @qry = (SELECT CONCAT('SELECT SUM(',GROUP_CONCAT(INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME SEPARATOR '+'), ')
FROM ',INFORMATION_SCHEMA.COLUMNS.TABLE_NAME,'
WHERE date_column BETWEEN \'2008-01-01\' AND \'2008-12-31\' ')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = 'table_name'
AND INFORMATION_SCHEMA.COLUMNS.DATA_TYPE = 'int');
PREPARE stmt FROM @qry;
EXECUTE stmt;
答案 2 :(得分:0)
这类似于@Nanne给出的答案,但是这个查询将构建像你用col1&lt;描述的那样的where子句。 1或col2&lt; 1 ....
SET @qry = (SELECT CONCAT('SELECT * FROM table1 where ',GROUP_CONCAT(INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME SEPARATOR ' < 1 or '), ' < 1')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = 'table1'
AND INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME != 'id'
AND INFORMATION_SCHEMA.COLUMNS.DATA_TYPE = 'int');
PREPARE stmt FROM @qry;
EXECUTE stmt
这是SQLFiddle(这个网站整天都在上下)