所以,我正在加入mysql来过滤掉一些不好的数据,我遇到了这个奇怪的问题。
payment_transaction_id
连接。 3463
。 证明记录在card_transaction_log中:
select count(*)
from card_transaction_log
where payment_transaction_id = 3463;
>> 1
证明记录在交易中:
select count(*)
from transaction
where payment_transaction_id = 3463;
>> 1
但是加入不起作用。
select count(*)
from card_transaction_log a, transaction b
where a.payment_transaction_id = b.payment_transaction_id
and a.payment_transaction_id = 3463;
>> 0
老实说,我以前从未在mysql中见过这样的东西。我甚至和我的同事核实过,以确保我不会疯狂和/或愚蠢。
更新
虽然这与上面相同,但此查询也不起作用:
select count(*)
from card_transaction_log a
join transaction b
on a.payment_transaction_id = b.payment_transaction_id
where a.payment_transaction_id = 3463;
>> 0
答案 0 :(得分:7)
payment_transaction_id
是什么类型的?我怀疑它不是INT而是VARCHAR。
如果您尝试将VARCHAR与INT进行比较,MySQL会自动将其转换为INT,但可能会发生一些奇怪的事情,例如:
'3463' = 3463
但也
'3463a' = 3463
但
'3463a' != '3463b'
请参阅小提琴here。您可以像这样测试您的查询:
select count(*)
from card_transaction_log
where payment_transaction_id = '3463';
并且我怀疑至少有一个查询会返回0.或者您可以强制您的联接使用整数值:
select count(*)
from card_transaction_log a
join transaction b
on a.payment_transaction_id+0 = b.payment_transaction_id+0
where a.payment_transaction_id = 3463;
答案 1 :(得分:0)
你可以尝试:
select count(*)
from card_transaction_log a
join transaction b
on a.payment_transaction_id = b.payment_transaction_id
where a.payment_transaction_id = 5081483008;
答案 2 :(得分:0)
我今天遇到了同样的麻烦,这就是我发现的。即使表A上的SQL选择和表B上的SQL选择显示主键和外键的值相等,但值实际上是不同的... a'\ n',当值显示在表中时未显示一个网格,是我所有外键值的结束字符...... 根本原因,我没注意我用来通过'import'填充表格的文件是在互联网上找到的损坏的CSV文件。
您可以进行快速测试,只需手动更新一些预期加入的外键和主键值,然后再次测试您的查询。如果它返回结果,你找到了根本原因!
答案 3 :(得分:0)
在我看来,这是因为数据中存在隐藏字符。
我使用以下命令导入了包含电子邮件列表的CSV文件:
LOAD DATA INFILE 'c:/temp/users.csv'
INTO TABLE cloudusers
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 0 ROWS;
因此,每个VARCHAR的末尾都有一个返回字符。 字符串看起来相同,但不同。
当我重新导入时使用
LOAD DATA INFILE 'c:/temp/users.csv'
INTO TABLE cloudusers
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 0 ROWS;
(请注意使用“ \ r \ n”而不是“ \ n”) 生成的VARCHAR随后匹配,并且所有联接都起作用。