首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL选择查询,而不是选择完全匹配?

MySQL选择查询,而不是选择完全匹配?
EN

Stack Overflow用户
提问于 2016-01-11 21:11:52
回答 2查看 426关注 0票数 0
代码语言:javascript
复制
SELECT DISTINCT p.id_product, t.id_tag, t.name FROM ps_tag t 
JOIN ps_product p ON p.id_product=t.name AND t.name 
IN(SELECT id_product FROM ps_product) 
AND p.available_for_order = 1 
GROUP BY t.id_tag, p.id_product
ORDER BY `p`.`id_product`  DESC

此查询返回如下结果(在正确的结果中)

代码语言:javascript
复制
id_product  id_tag  name    
43         79020    43P109
43         79021    43P109
43         79022    43P109
43         105796   43
43         114789   43

ON的声明说是p.id_product=t.name,但43不是43P109。我哪里出问题了?我只需要p.id_product等于t.name的结果,所以只返回名称43?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-11 21:21:28

我认为铸造问题是整数还是字符

试着使用

代码语言:javascript
复制
 SELECT DISTINCT p.id_product, t.id_tag, t.name 
 FROM ps_tag t 
 JOIN ps_product p ON CAST(p.id_product as char(50)) =t.name 
     AND t.name IN(SELECT id_product 
        FROM ps_product)
     AND p.available_for_order = 1 
 GROUP BY t.id_tag, p.id_product
 ORDER BY `p`.`id_product`  DESC
票数 0
EN

Stack Overflow用户

发布于 2016-01-11 21:22:49

就mysql而言,42实际上等于"42Pwhatever"

代码语言:javascript
复制
mysql> select 42 = "42P123";
+---------------+
| 42 = "42P123" |
+---------------+
|             1 |
+---------------+
1 row in set, 1 warning (0.01 sec)

如果希望此比较失败,则将整数列转换为二进制字符串:

代码语言:javascript
复制
mysql> select cast(42 as binary) = "42P123";
+-------------------------------+
| cast(42 as binary) = "42P123" |
+-------------------------------+
|                             0 |
+-------------------------------+
1 row in set (0.00 sec)

这样做的原因是您的列有不同的类型,当这种情况发生在表达式中时,mysql试图将它们转换为公共类型(在特定情况下为整数)。因此,"42P123"变成了42 (它停止了对第一个非数字字符的转换。上面的显式强制转换告诉mysql将整数转换为字符串,然后比较字符串。

参见此处的mysql转换规则:http://dev.mysql.com/doc/refman/5.7/en/type-conversion.html

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34731159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档