问题描述
|
MysqL>从tr选择*;
+ ------ +
| mnt |
+ ------ +
| jun |
| mar |
| jan |
|八月|
+ ------ +
设置4行(0.00秒)
MysqL>从tr1选择*;
+ ------ + ------ +
| mnt | id |
+ ------ + ------ +
|八月| 11 |
| jan | 12 |
| mar | 15 |
|四月| 16 |
+ ------ + ------ +
设置4行(0.00秒)
它适用于此查询。
MysqL>在tr.mnt = tr1.mnt上的tr join tr1中选择*;
+ ------ + ------ + ------ +
| mnt | mnt | id |
+ ------ + ------ + ------ +
|八月|八月| 11 |
| jan | jan | 12 |
| mar | mar | 15 |
+ ------ + ------ + ------ +
设置3行(0.00秒)
MysqL>从tr2选择*;
+ ------------ + ------ +
| mn | id |
+ ------------ + ------ +
| 2009-02-14 | 11 |
| 2009-03-03 | 12 |
| 2009-08-08 | 12 |
+ ------------ + ------ +
设置3行(0.00秒)
MysqL>插入tr2值(\'2009-01-01 \',14);
查询正常,1行受影响(0.06秒)
但它对此不起作用。
MysqL>在tr.mnt = MONTHNAME(tr2.mn)上的tr join tr2中选择*
空置(0.00秒)
请给出确切的查询。
解决方法
MONTHNAME(date)
返回一个varchar,所以\“是\”-您可以比较它们。
考虑以下语法:
select *
from A
join B on B.InvoiceMonth = MONTHNAME(A.Mnth);
, 由于MONTHNAME()返回一个字符串,而InvoiceMonth是一个字符串,因此您可以合理地比较它们。因此,在宽泛的范围内,您的查询是可以的。不过,您应该使用现代的JOIN表示法:
SELECT *
FROM A
JOIN B ON B.InvoiceMonth = MONTHNAME(A.Mnth)
JOIN C ON B.InvoiceMonth = MONTHNAME(C.Monthx)
您不需要使用所有三个条件:如果X = Y并且Y = Z,则X =Z。
当然,由于2011年1月的结果与2010年1月的结果并没有真正的可比性,因此您确实需要弄清楚年份信息的来源,并确保不要混淆两者之间的匹配。年份。