0

我厌倦了用这个把头撞到墙上。到目前为止,我们团队中的任何人都无法弄清楚它为什么不起作用。

我有两个表,我需要在每个表上相互检查行以确保准确性。

表格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'

这完全符合我的预期。左列中的所有值都存在,右列中没有匹配项的值为 NULL。这解决了我需要知道的问题:“table1 中的哪些城市不在 table2 中。”

接下来我需要根据 WHERE 子句知道 table2 中哪些城市不在 table1 中。一个 RIGHT JOIN 应该这样做。正确的?

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

为什么这不起作用?

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 = city),如果我使用 = 运算符它也不起作用(即使在我工作的 LEFT JOIN 中)

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

4

4 回答 4

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 )

可能是您的查询在对空值执行匹配时遇到问题?

于 2013-05-07T19:16:35.960 回答
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 团队报告错误。

于 2013-05-07T19:18:14.010 回答
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() 复杂得多。

于 2013-05-07T19:53:07.220 回答
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,这很容易解决。

于 2013-05-08T22:54:27.767 回答