【问题标题】:MySQL SELECT query not selecting exact match?MySQL SELECT 查询没有选择完全匹配?
【发布时间】:2016-01-12 05:28:57
【问题描述】:
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

此查询返回这样的结果(在正确的结果中)

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?

【问题讨论】:

  • 如果删除 JOIN 中的“AND t.NAME IN(SELECT id_product FROM ps_product)”子句,查询返回的结果是否有所不同?
  • @Forty3 不,是一样的。我添加它是为了解决它,但两种方式都是一样的。
  • 我认为@weirdan 提到的Mysql 文档似乎提供了答案:“原因是有许多不同的字符串可以转换为值1,例如'1', '1',或'1a'。”看起来它正在将“43”转换为相等测试中的数字。非常令人不安。

标签: mysql


【解决方案1】:

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

mysql> select 42 = "42P123";
+---------------+
| 42 = "42P123" |
+---------------+
|             1 |
+---------------+
1 row in set, 1 warning (0.01 sec)

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

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】:

    我认为是整数与字符的转换问题

    尝试使用

     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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多