2013-05-07 60 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