2013-04-06 62 views
-2

我有一个显示记录明智的系统。我有用户选择年份的下拉菜单,我将该值存储在变量$year中。所以现在当$year = 2013-2014,它不应该显示2014-2015年的记录。顺便说一句,当我插入我的contractNumber时,我也插入用户在登录时选择的年份。例如contractNumber = 1#2013-2014在php中显示特定年份的记录mysql mysql

我尝试这样的查询:

SELECT * FROM contract WHERE contarctNumber RLIKE "^$year"; 

现在,当我选择2014 - 2015年一年,但仍从2013-2014年显示的所有记录。

有什么建议吗?

+2

这是一个PHP的问题或数据库设计?你没有与每份合同有关的时间戳字段吗? – Mawg 2013-04-06 07:53:59

+0

这是PHP的问题。不,我没有时间戳字段。但我确实有contractDate字段,它是由用户手动插入的。 – ashah142 2013-04-06 08:02:28

+1

@ ashah142你应该将你的日期转换为int(unix timestamp)或者mysql日期类型。否则,如果数据库增长,“LIKE”操作将需要很长时间。此外,为什么不使用ISO8601日期,所以你至少要让它们可排序(以及更有效的搜索索引)? – 2013-04-06 08:08:39

回答

1

尝试此查询

SELECT * FROM contract WHERE contarctNumber LIKE "%$year"; 

SQLFiddle DEMO

CREATE TABLE test (contarctNumber varchar(25)); 
INSERT INTO test VALUES ('1#2013-2014'), ('1#2014-2015'), ('2#2014-2015'); 

选择查询

SELECT * FROM test WHERE contarctNumber LIKE "%2014-2015"; 

输出

| CONTARCTNUMBER | 
------------------ 
| 1#2014-2015 | 
| 2#2014-2015 | 
+0

我试过,但是,当我选择2014-2015年时,它仍然显示2013-2014年的记录,因为它们都具有2014年的共同点。 – ashah142 2013-04-06 07:57:12

+1

@ ashah142不,它不会,你可以在这里查看演示http://www.sqlfiddle.com/#!2/45ea9/1 – 2013-04-06 08:07:14

+0

它似乎在这里工作,但'%$ year'它仍然显示记录从2013年至2014年。 – ashah142 2013-04-06 08:11:56

0

如果contractNumber总是在日期范围结束,为什么不使用:

SELECT * FROM contract WHERE contarctNumber LIKE "%$year"; 

这意味着它会选择$year之前匹配任何东西,但仍符合规定的范围。

选项#2:

SELECT * from contract where RIGHT(contarctNumber, 9) = '$year'; 
+0

我试过,但是,当我选择2014-2015年时,它仍然显示2013-2014的记录,因为它们都有'2014' – ashah142 2013-04-06 07:56:46

+0

'-'不是特殊字符在'like'命令中,所以声明应该可以工作。什么类型的字段是'contractNumber'?您可能想尝试'BINARY LIKE“%$ year”' – Jon 2013-04-06 08:01:55

+0

contarctNumber是varchar。所以我猜二元样不是一个选项。 – ashah142 2013-04-06 08:04:56