我无法获得使用REGEXP-mysql的正确连接
我受够了用这个把头撞墙。到目前为止,我们团队中没有人能弄清楚它为什么不起作用 我有两个表,我需要检查每一个表上的行的准确性 表1我无法获得使用REGEXP-mysql的正确连接,mysql,right-join,Mysql,Right Join,我受够了用这个把头撞墙。到目前为止,我们团队中没有人能弄清楚它为什么不起作用 我有两个表,我需要检查每一个表上的行的准确性 表1 feature_name | state_alpha | population data city1 | MI | 34567 city3 | MI | 4567 city4 | MI | 5567 表2 city c
feature_name | state_alpha | population data
city1 | MI | 34567
city3 | MI | 4567
city4 | MI | 5567
表2
city
city1
city2
city3
我已使用左连接来处理此查询:
SELECT f.feature_name, f.population_data, f.state_alpha, bc.city
FROM `fedcodes` AS f
left JOIN bob_cities AS bc ON bc.city
REGEXP concat( f.feature_name )
WHERE f.population_data >1000
AND f.state_alpha = "MI"
AND f.feature_name NOT
REGEXP 'city of'
AND f.feature_name NOT regexp 'town of'
这正是我所期望的结果。左栏中的所有值都存在,右栏中的空值不匹配。这解决了我需要知道的问题:哪些城市在表1中,哪些城市不在表2中
接下来,根据WHERE子句,我需要知道表2中哪些城市不在表1中。右连接应该可以做到这一点。对吗
然而,我无法让它工作,我觉得我已经尝试了所有可能的查询排列,并在这个过程中崩溃了我的家庭服务器好几次
为什么这样不行
SELECT f.feature_name, f.population_data, f.state_alpha, bc.city
FROM `fedcodes` AS f
RIGHT JOIN bob_cities AS bc ON f.feature_name
REGEXP concat( bc.city )
WHERE f.population_data >1000
AND f.state_alpha = "MI"
AND f.feature_name NOT
REGEXP 'city of'
AND f.feature_name NOT regexp 'town of'
我也试过这个
SELECT f.feature_name, f.population_data, f.state_alpha, bc.city
FROM `fedcodes` AS f
RIGHT JOIN bob_cities AS bc ON (f.feature_name
REGEXP concat( bc.city )
AND f.population_data >1000
AND f.state_alpha = "MI"
AND f.feature_name NOT
REGEXP 'city of'
AND f.feature_name NOT regexp 'town of')
我之所以使用REGEXP,是因为即使两个表feature\u name=city中的行名称相同,但如果使用=运算符,即使在我使用的左连接中也不起作用
当我在phpmyadmin中运行查询时,发生的一切是服务器保持忙碌一段时间,然后冻结 尝试嵌套fedcodes,使用它只需要的其他WHERE子句:
可能是您的查询在对空值执行匹配时遇到问题?只需翻转连接顺序即可
SELECT f.feature_name, f.population_data, f.state_alpha, bc.city
FROM bob_cities as bc
LEFT JOIN `fedcodes` as f ON ON bc.city REGEXP concat( f.feature_name )
...
这应该行得通
如果你用一个查询来破坏mySQL,你应该考虑向MySQL团队报告一个bug。
尝试修复第二个查询的ReXEP部分以匹配第一个:
SELECT f.feature_name, f.population_data, f.state_alpha, bc.city
FROM `fedcodes` AS f
RIGHT JOIN bob_cities AS bc ON bc.city REGEXP f.feature_name
...
更好的方法是使用LOCATE假设=不起作用,=甚至更好:
SELECT f.feature_name, f.population_data, f.state_alpha, bc.city
FROM `fedcodes` AS f
RIGHT JOIN bob_cities AS bc ON 0 < LOCATE(TRIM(f.feature_name), TRIM(bc.city))
...
记住,REGEXP通常需要一个模式。它比包含或等于要复杂得多 首先,我要感谢大家的回应。我尝试了你们建议的一切,但都没用。但事实证明,这毕竟不是问题所在。这就是为什么我试过的都不管用 一名团队成员发现数据库中的数据不知何故已损坏。我不确定细节,但数据的来源是CSV,他说里面不好。他给了我一份新的CSV副本,我用它重新创建了数据库,一切正常 以下是工作查询:
SELECT DISTINCT f.feature_name, f.population_data, b.city
FROM `fedcodes` f
RIGHT JOIN bob_cities_fix b ON f.feature_name = b.city
AND f.population_data =0
AND f.state_alpha = "al"
书的正确连接方式正是它所需要的
您可能会注意到,在最初的查询中,我过滤了1000多个城市的数据,结果发现我需要在数据库中找到没有人口的城市,以便进行正确的连接,以准确地返回我需要的数据
然而,一旦我从查询中得到反馈,而不是冻结PHPmyadmin,这是一个简单的修复方法 至于等号不起作用,这通常是由列值末尾的空格引起的。您可以使用类似SELECT*的查询从fedcodes WHERE feature\u name TRIMfeature\u name找到它们。在第二个查询中,您已反转了REGEXP的字符串和模式。功能名称中是否可能包含一些bc.city没有的额外数据?如果不是,考虑= = ReXEP。不工作的符号应该告诉我有一个更大的问题。我尝试过在mysql和PHP中进行微调,但都不起作用。
SELECT DISTINCT f.feature_name, f.population_data, b.city
FROM `fedcodes` f
RIGHT JOIN bob_cities_fix b ON f.feature_name = b.city
AND f.population_data =0
AND f.state_alpha = "al"