我一直在尝试在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 keyword matches 119 8000 0 119 John 1 119 Deere 1 119 Midroller 1
我看过这个: MySql: Compare 2 strings which are numbers? 但它并没有真正帮助。
我也发现了这个MySQL Query doesn't seem to be outputting expectations,但我正在尝试将它们作为字符串进行比较,而不是数字。
即使尝试
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,如果我能够在这个阶段我想保持搜索相当严格。
有什么明显的事我做错了吗?
答案 0 :(得分:1)
在这种情况下,通常意味着您的“行为不端”值中包含前导/尾随空格。
你可以通过像这样的查询找到所有这些“坏”记录
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 演示
答案 1 :(得分: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 ;