|
我正在使用MySQL包括以下列表:
( q4 b9 L, k3 j% Z! i+ k# Xid,january,february,march,april,etc表中的数据如下:
& l- }4 i2 }2 Z" y/ Oaa,0,0,1,0ab,1,0,1,0ac,1,1,0,0ad,1,1,1,0要查询它,我可以询它:
+ I3 A& B8 m2 S: r9 V9 q' Y xselect * from table where january = 1 and february = 1结果将是:9 T# ~& f0 G4 \, x* h! ^
ac,1,1,0,0ad,1,1,1,0我想知道是否有办法做到这一点:4 W/ q6 d& j! z2 L; s R1 {
select * from table where table.columns = 1我想在表达式中使用表列,而不需要手动指定名称(键入)。
$ ~8 i, I, W) v2 X1 |+ ~: }奖励( 1)问题 :
3 J2 p# |) ~# ?( O能否使用Match / Against这样做:
0 B- {3 a$ L: Q; i# V! Z! Bselect * from tablewhere( match (somehow,get,the,table,columns,I,need,here) against (1 in boolean mode))谢谢你的时间!' {2 v8 N& \8 Q, i% X9 q: o t
, u. _, n3 s5 t$ b" @3 N5 y5 o 解决方案:
D) C) z, F9 S4 y% I/ E$ Z 您必须使用Prepared Statement,因为你要执行的操作只能动态SQL来完成:
" l b) B5 b4 o/ t3 B% l3 wSET @stmt = 'SELECT * FROM YOUR_TABLE WHERE 1 = 1 'SET @stmt = CONCAT(@stmt,(SELECT CONCAT_WS(' AND ',CONCAT(column_name,' = ) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'YOUR_TABLE AND table_schema = 'db_name AND column_name NOT IN ('id')))REPARE stmt FROM @stmt;EXECUTE stmt;DEALLOCATE PREPARE stmt;第一个SET句子构建基本SELECT句子; 1 = 1部分正好可以使 AND column = 1更容易连接
7 k$ J- R3 c! i) n# ^ ^4 P. E第二条SET句子连接查询内容,根据表名列表获得第一条SET句子中字符串的末尾。这个想法是这样的:
# k5 i# Q3 J5 t; `& Z sSELECT 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')…类似于 AND january = 1 AND february = 1 ...如果WHERE如果句子中不需要其他列,则必须更新NOT
- R Y L3 }# h5 G2 F* UIN子句。- Q2 I% X: r- ?2 v! k
其余的只是准备好的标准句子,必须在存储过程中进行。 |
|