2

我一直在尝试在 mysql 中编写一个简单的关键字比较查询,但由于某种原因,全数字关键字与全数字搜索词不匹配。

我有一个产品表、一个关键字表和一个连接表。为了使事情更简单,我使用了一个执行连接的视图,为我提供了每个产品 ID 的关键字字符串的简单列表。特别是 1 个产品有 4 个关键字,“John”、“Deere”、“8000”、“Midroller”,这些关键字在视图中和加入时会正确显示。

我遇到麻烦的地方是 (keyword = "8000") 对于“8000”关键字来说永远不是真的。

例子

SELECT a.id, kw.keyword AS keyword, (kw.keyword = 'John' OR 
  kw.keyword = 'Deere' OR 
  kw.keyword = "8000" OR 
  kw.keyword = 'Midroller') AS matched
FROM `kc5n2_product` AS a
INNER JOIN `product_keywords` AS kw ON a.id = kw.product
WHERE a.id =119

返回

id 关键字匹配
119 8000 0
119 约翰 1
119 迪尔 1
119 中辊 1

我看过这个: MySql:比较 2 个字符串,它们是数字? 但它并没有真正帮助。

我还发现这个MySQL Query 似乎没有输出期望,但我试图将它们作为字符串而不是数字进行比较。

甚至尝试

SELECT a.id, kw.keyword AS keyword, (CAST(kw.keyword as Char(4)) = CAST("8000" as Char(4))) AS matched

试图强制 mysql 将它们都解释为字符串根本没有帮助。

我发现如果我使用它会匹配搜索词

kw.keyword LIKE "%8000%"

但如果可以的话,我宁愿避免 LIKE,因为在这个阶段我想让搜索保持相当严格的限制。

有什么明显的我做错了吗?

4

2 回答 2

3

在这种情况下,这通常意味着您的“行为不端”值中有前导/尾随空格。

您可以通过这样的查询找到所有这些“坏”记录

SELECT *
  FROM keywords
 WHERE CHAR_LENGTH(keyword) <> CHAR_LENGTH(TRIM(keyword))

这是SQLFiddle演示

您显然可以通过像这样的简单更新来修复它们

UPDATE keywords
   SET keyword = TRIM(keyword)
 WHERE CHAR_LENGTH(keyword) <> CHAR_LENGTH(TRIM(keyword))

这是SQLFiddle演示

于 2013-08-23T04:31:19.193 回答
0

我没有看到你发布的内容有什么问题。我设置了一个测试用例:

CREATE TABLE product (id INT);
CREATE TABLE product_keywords (product INT, keyword VARCHAR(32));

INSERT INTO product
  VALUES (19),(20);
INSERT INTO product_keywords 
  VALUES (19,'Foo'),(19,'John'),(19,'Deere'),(19,'8000'),(19,'Midroller');

SELECT a.id
     , kw.keyword AS keyword
     , ( kw.keyword = 'John' OR 
         kw.keyword = 'Deere' OR 
         kw.keyword = "8000" OR 
         kw.keyword = 'Midroller'
       ) AS matched
  FROM `product` a 
  JOIN `product_keywords` kw 
    ON a.id = kw.product
 WHERE a.id = 19

    id  keyword    matched  
------  ---------  -------
    19  Foo              0
    19  John             1
    19  Deere            1
    19  8000             1
    19  Midroller        1

对我来说看起来不错。(我会在 8000 文字周围使用单引号而不是双引号,但在默认的 MySQL 配置中,它没有任何区别。)

也许它在您的视图查询中存在问题。

这个查询返回什么?

SELECT kw.* FROM product_keywords kw WHERE kw.product = 119 ORDER BY kw.keyword ;
于 2013-08-23T03:54:02.353 回答