【问题标题】:I can't get a RIGHT JOIN to work with REGEXP mysql我无法获得与 REGEXP mysql 一起使用的 RIGHT JOIN
【发布时间】:2013-05-07 19:03:53
【问题描述】:

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

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

表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 中运行查询时发生的所有事情都是服务器保持忙碌一段时间然后冻结。

【问题讨论】:

  • 等号不起作用,通常是由列值末尾的空格引起的。您可以通过 SELECT * FROM fedcodes WHERE feature_name <> TRIM(feature_name) 之类的查询找到它们。
  • 在第二个查询中,您颠倒了 REGEXP 的字符串和模式。 feature_name 是否可能包含一些 bc.city 没有的额外数据?如果不是,请考虑使用= 而不是REGEXP
  • 等号不起作用应该提示我存在更大的问题。我尝试在 mysql 和 PHP 中进行修剪,但都没有成功。

标签: mysql right-join


【解决方案1】:

尝试嵌套fedcodes,以及只有it需要的其他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 )

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

【讨论】:

    【解决方案2】:

    只需翻转连接的顺序...

     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 团队报告错误。

    【讨论】:

      【解决方案3】:

      尝试修复第二个查询的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() 复杂得多。

      【讨论】:

        【解决方案4】:

        首先我要感谢大家的回复。我尝试了你们建议的一切,但无济于事。但事实证明,这毕竟不是查询。这就是为什么我没有尝试过的原因。

        一位团队成员发现数据库中的数据以某种方式损坏。我不确定细节,但数据的来源来自 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,这很容易解决。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多