2016-11-07 113 views
0

从来就搜索了很多,但我不能弄清楚如何做到这一点,如果it's可能......使用变量,而不是字段名在MySQL中选择查询

我有这个表:

CREATE TABLE bilanci (
    id    int AUTO_INCREMENT NOT NULL, 
    medicoid  int NOT NULL, 
    `1`    int NOT NULL DEFAULT 0, 
    `2`    int NOT NULL DEFAULT 0, 
    `3`    int NOT NULL DEFAULT 0, 
    `4`    int NOT NULL DEFAULT 0, 
    `5`    int NOT NULL DEFAULT 0, 
    `6`    int NOT NULL DEFAULT 0, 
    `7`    int NOT NULL DEFAULT 0, 
    `8`    int NOT NULL DEFAULT 0, 
    `9`    int NOT NULL DEFAULT 0, 
    `10`   int NOT NULL DEFAULT 0, 
    `11`   int NOT NULL DEFAULT 0, 
    `12`   int NOT NULL DEFAULT 0, 
    conguagliodic decimal(10,2), 
    totbilancianno int DEFAULT 0, 
    totpagato  decimal(12,2), 
    totdapagare  decimal(12,2), 
    conguaglio  decimal(10,2), 
    rifanno   int NOT NULL, 
    pvimun   decimal(10,4) NOT NULL DEFAULT 9.4432, 
    PRIMARY KEY (id) 
) ENGINE = InnoDB; 

以数字命名的的Fileds对应个月,我需要有一个选择,如:

select medicoid, (month(curdate()) -2), totdapagare from bilanci 

(month(curdate()) -2)符合我需要选择的领域。

这可能吗?

+0

它可能以某种方式成为可能,但它不会太简单......你不能否认你的数据库结构吗?不要将不同的列存储几个月,将月份值存储在不同的表中 – fthiella

回答

0

我建议你一定要规范你的数据库结构,你可以有一个表是这样的:

CREATE TABLE bilanci (
    id    int AUTO_INCREMENT NOT NULL, 
    medicoid  int NOT NULL, 
    conguagliodic decimal(10,2), 
    totbilancianno int DEFAULT 0, 
    totpagato  decimal(12,2), 
    totdapagare  decimal(12,2), 
    conguaglio  decimal(10,2), 
    pvimun   decimal(10,4) NOT NULL DEFAULT 9.4432, 
    PRIMARY KEY (id) 
) ENGINE = InnoDB; 

和第二台bilanci_month:

create table bilanci_month (
    id int auto_increment, 
    bilanci_id int, 
    rifanno int NOT NULL, 
    month int NOT NULL, 
    value int) 

(bilanci_id可以被定义为一个外国bilanci_month的关键字),那么您的选择查询将如下所示:

select 
    b.medicoid, 
    coalesce(bm.value, 0), 
    b.totdapagare from bilanci 
from 
    bilanci b left join bilanci_month bm 
    on b.id = bm.bilanci_id and bm.month = month(curdate())-2 

还要小心month(curdate())-2,如果一月份是一月份或二月份会发生什么?你必须实现一些逻辑来获得例如前一年的十一月或十二月(并将此逻辑添加到你的连接中)。

+0

感谢您的解决方案和建议!我试过这似乎工作正常:选择如果((选择月份(curdate()) - 2)= 0,12,如果((选择月份(curdate)-2)= -1,11,(选择月份(选择年份(curdate())))))作为月份并且 选择是否((选择月份(curdate()) - 2)<= 0,(选择年份(curdate())-1),(选择年份(curdate())) )为一年 –

相关问题