2013-05-07 101 views
0

工作我厌倦了这个与头撞墙。到目前为止,我们团队中没有人可以找出为什么它不起作用。我不能得到一个正确的加入与REGEXP mysql

我有两个表格,我需要检查每个行上的行以确保其准确性。

表1

feature_name | state_alpha | population data 
city1  |  MI  |   34567 
city3  |  MI  |   4567 
city4  |  MI  |   5567 

表2

city 
city1 
city2 
city3 

我已经得到了LEFT JOIN与此查询的工作:

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子句知道table1中哪些城市不在table1中。一个合适的人应该这样做。正确?

但是我无法让它工作,我觉得我已经尝试了查询的每一个可能的排列组合,并且在这个过程中我的家用服务器崩溃了很多次。

为什么不能正常工作?

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_NAME =城市),如果我用=操作不工作(即使在LEFT JOIN我有工作)

当我在phpmyadmin中运行查询时发生的所有事情是服务器保持忙一段时间然后冻结。

+1

至于等号不起作用,这通常是由列值末尾的空格造成的。你可以用像SELECT * FROM fedcodes WHERE feature_name <> TRIM(feature_name)'这样的查询来查找它们。 – 2013-05-07 19:11:17

+0

在第二个查询中,您已颠倒了REGEXP的字符串和模式。 feature_name是否可能包含一些bc.city中没有的额外数据?如果不是,请考虑'='而不是'REGEXP'。 – 2013-05-07 19:26:03

+0

等号不起作用应该让我知道存在更大的问题。我试图修剪在MySQL和PHP,但都没有工作。 – moult86 2013-05-08 22:56:03

回答

0

尝试筑巢fedcodes,与其他WHERE条款,只有需求:

SELECT f.feature_name, f.population_data, f.state_alpha, bc.city 
FROM (SELECT feature_name, population_data, state_alpha 
    FROM `fedcodes` 
    WHERE population_data >1000 
    AND state_alpha = "MI" 
    AND feature_name NOT 
    REGEXP 'city of' 
    AND feature_name NOT regexp 'town of' 
    ) AS f 
RIGHT JOIN bob_cities AS bc ON f.feature_name 
REGEXP concat(bc.city) 

这可能是因为你的查询有困难的空值进行比赛吗?

0

只是前后翻页的加入顺序...

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) 
    ... 

这应该工作。

如果你用查询崩溃mysqld,你应该考虑向mysql团队报告一个bug。

0

尝试固定第二个查询的REGEXP部分匹配第一:

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通常需要一个模式。它比contains()或equals()复杂得多。

0

首先我要感谢大家的回应。我尝试了你们建议无效的一切。但事实证明,这毕竟不是问题。这就是为什么我没有尝试过。

一个团队成员发现数据库中的数据以某种方式损坏。我不确定细节,但数据的起源来自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个城市的数据,事实证明,我需要在数据库中找到没有人口的城市以便RIGHT JOIN准确地返回我需要的数据。

但是,一旦我从查询中获得反馈而不是冻结PHPmyadmin,这是一个简单的修复方法。

+0

耶等于工作,因为它应该!很高兴你能解决问题。 – 2013-05-10 17:39:29