我在MySQL中遇到了针对()的match()问题。 我不能将2个columfields相互匹配,只有当我使用一个程序时,才清楚。
现在问题: 我有一个查询来搜索双项(只有技术数据):
SELECT t1.acid,t2.acid, t1.Brand, t2.ModelNameRough,t1.ModelNameDetail, t2.ModelNameDetail,.........
FROM ref_web_tb t1 join ref_web_tb t2
on t1.Brand = t2.Brand
and t1.ModelNameRough = t2.ModelNameRough
and t1.BodyType ....(alot of other things to compare)
and (t1.acid < t2.acid)
但这还不够。 有一个名为“modelnamedetail”的字段锁定如下: “1.9 TDI COMFORT VARIANT DPF” 要么 “1.9 TDI COMFORTLINE VARIANT DPF”
(只有舒适的线路不同,但两辆车的价格不同等等,但技术数据相同)
所以我必须将t1.modelname与t2.modelname匹配,并使用分数来检查名称是否几乎相同。 (另外,这将是检查是否存在双重条目的数据的loooooot,因为在同一个粗略模型中有很多具有相同技术数据的汽车)
对()的匹配()的过程没问题,我会这样做:(只是一个测试)
DELIMITER $$
DROP PROCEDURE IF EXISTS `offensichtlich_doppelte` $$
CREATE PROCEDURE `offensichtlich_doppelte` (search_string TEXT)
DETERMINISTIC
READS SQL DATA
BEGIN
SELECT t1.acid, t1.Brand,t1.ModelNameRough,t1.ModelNameDetail, MATCH (t1.ModelNameDetail) AGAINST (search_string) AS score
FROM ref_web_tb t1
limit 50;
END $$
DELIMITER ;
但现在我不知道如何在程序中使用查询结果?! 我完全糊涂了现在该做什么;( 有人可以给我一个提示,我可以解决这个问题吗?
另一个简短的问题: 有时像“gearboxtype”这样的东西是空的。 如果其中一个技术字段为null,则不会列出。 我可以这样做:
SELECT *
FROM ref_web_tb t1 join ref_web_tb t2
on ....
and if gearboxtype is null then ignore gearboxtype
....
我想的是:
SELECT *
FROM ref_web_tb t1 join ref_web_tb t2
on ....
and if(t1.gearboxtype is null, ignore, t1.gearboxtype = t2.gearboxtype)
....
会起作用,但似乎没有,因为我不知道如何忽视这个案子;( (等等..也许是答案?)
感谢阅读;)
答案 0 :(得分:1)
关于你的第一个问题,我认为cursors正是你要找的。
首先,您需要在过程中声明一些变量,以存储您获得的数据。
DECLARE a CHAR(10);
DECLARE b INT;
由于光标只能遍历一次,因此必须在其末尾处理NOT FOUND
异常。
DECLARE done INT DEFAULT FALSE;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
然后您声明cursor
来获取您的数据。
DECLARE results CURSOR
FOR
SELECT stuff, otherstuff FROM someTable;
这只是创建了光标。然后打开它,以便实际执行查询:
OPEN results;
要获得查询结果,请迭代光标:
read_loop: LOOP
FETCH results INTO a, b;
IF done THEN
LEAVE read_loop;
END IF;
--do your business here with a and b
END LOOP;
最后,关闭光标:
CLOSE results;
希望这有帮助。