使用MySQL将值与表中的多列(在一个语句中)匹配

Mr.*_*ith 9 mysql sql

我正在使用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)

谢谢你的时间!:)

OMG*_*ies 4

你必须使用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 子句。

其余的只是标准的准备好的语句内容,这一切都必须在存储过程中进行。