我正在使用MySQL中包含以下列的表:
id, january, february, march, april, etc
Run Code Online (Sandbox Code Playgroud)
表中的数据如下所示:
aa, 0, 0, 1, 0
ab, 1, 0, 1, 0
ac, 1, 1, 0, 0
ad, 1, 1, 1, 0
Run Code Online (Sandbox Code Playgroud)
要查询它,我可以轻松地执行此操作:
select * from table where january = 1 and february = 1
Run Code Online (Sandbox Code Playgroud)
结果将是:
ac, 1, 1, 0, 0
ad, 1, 1, 1, 0
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法这样做:
select * from table where table.columns = 1
Run Code Online (Sandbox Code Playgroud)
我想在表达式中使用表列而不实际手动指定名称(键入它们).
奖金(+1)问题:
可以使用匹配/反对这样做:
select * from table
where
(
match (somehow,get,the,table,columns,I,need,here)
against (1 in boolean mode)
)
Run Code Online (Sandbox Code Playgroud)
谢谢你的时间!:)
你必须使用Prepared Statement,因为你想要做的事情只能用动态SQL来完成:
SET @stmt = 'SELECT * FROM YOUR_TABLE WHERE 1 = 1 '
SET @stmt = CONCAT(@stmt, (SELECT CONCAT_WS(' AND ', CONCAT(column_name, ' = 1 '))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'YOUR_TABLE'
AND table_schema = 'db_name'
AND column_name NOT IN ('id')));
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Run Code Online (Sandbox Code Playgroud)
第一个 SET 语句构造一个基本的 SELECT 语句;“1 = 1”部分只是为了更容易连接“ AND column = 1”
第二个 SET 语句将查询的内容连接到第一个 SET 语句中的字符串末尾,以根据表名获取列列表。这个想法是这样的:
SELECT CONCAT_WS(' AND ', CONCAT(column_name, ' = 1 '))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'YOUR_TABLE'
AND table_schema = 'db_name'
AND column_name NOT IN ('id')
Run Code Online (Sandbox Code Playgroud)
...将返回类似于“”的行AND january = 1 AND february = 1 ...。如果 WHERE 子句中有其他不需要的列,则必须更新 NOT IN 子句。
其余的只是标准的准备好的语句内容,这一切都必须在存储过程中进行。