提取一个较大的mysql查询的一部分以独立使用

时间:2016-05-20 22:21:31

标签: mysql regex concat

我目前正在使用以下mysql查询,但由于进行了一些重大的重新编码,我需要将此查询的一小部分用于它自己。 当前查询是

$sql = sprintf('INSERT INTO FENQUIRY
                (ENREGION, ENNAME, ENCOMP, ENADD1, ENADD2, ENADD3, ENCNTY,
                 ENPCODE, ENCNTRY, ENTEL, ENDATE, ENDATELCON, ENCAT,
                 ENCONSRS, ENADVER, ENTYPE, EN_CUSTOMER_ID)
                SELECT
                    (SELECT region
                         FROM postcode2region
                         WHERE ab.entry_postcode REGEXP
                             CONCAT("^", postcode_prefix, "[:digit:]*")
                         ORDER BY postcode_prefix DESC LIMIT 1
                    ) AS ENREGION,
                    c.ENCONNAME AS ENNAME,
                    IF(ab.entry_company <> "", ab.entry_company,
                         CONCAT(c.ENCONNAME, " - online")) AS ENCOMP,
                    ab.entry_street_address AS ENADD1,
                    ab.entry_suburb AS ENADD2,
                    ab.entry_city AS ENADD3,
                    ab.entry_state AS ENCNTY,
                    ab.entry_postcode AS ENPCODE,
                    cc.countries_name AS ENCNTRY,
                    c.ENCONTEL AS ENTEL,
                    CURDATE() AS ENDATE,
                    CURDATE() AS ENDATELCON,
                    "X" AS ENCAT,
                    1 AS ENCONSRS,
                    "WWW" AS ENADVER,
                    "70" AS ENTYPE,
                    c.ENCON_ID AS EN_CUSTOMER_ID
                FROM FENQCON c
                LEFT JOIN address_book ab
                      ON ab.address_book_id = c.ENCON_ZEN_DEFAULT_ADDRESS_ID
                LEFT JOIN countries cc
                      ON cc.countries_id = ab.entry_country_id
                WHERE c.ENCON_ID = %d
                LIMIT 1',
                $_SESSION['customer_id']);

我想使用的部分是

SELECT region FROM postcode2region
    WHERE ab.entry_postcode REGEXP
        CONCAT("^", postcode_prefix, "[:digit:]*")
    ORDER BY postcode_prefix DESC LIMIT 1

但如果我单独运行它显然会报告它不知道ab.entry_postcode是什么,所以我尝试将其更改为

SELECT region FROM postcode2region
    WHERE (SELECT entry_postcode FROM address_book REGEXP
        CONCAT("^", postcode_prefix, "[:digit:]*"))
    ORDER BY postcode_prefix DESC LIMIT 1

然后我只是收到#1064的错误消息 - 您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在'REGEXP CONCAT(“^”,postcode_prefix,“[:digit:] *”)附近使用正确的语法。)ORDER BY postcode_prefix DESC'在第1行

简而言之,查询应该查看存储在address_book表的名为entry_postcode的字段中的邮政编码,只取该邮政编码的前导字母,然后从postcode2region表的区域字段中获取匹配数据。 / p>

我确信它应该可以在一个查询中完成,但我还没有设法解决它。如果没有,我会以两个查询的方式进行。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果您需要提取邮政编码的前缀(与正则表达式匹配的部分)作为查询的一部分,那么这并不容易,如果您在代码中进行进一步处理而不使用SQL,则可能会更好。有关如何提取前缀的详细信息,请参阅this

否则,我不知道你的桌子究竟是什么样子,但无论如何我都会尝试。我还会提到我不习惯MySQL(但是Oracle)。您要使用的查询部分是:

SELECT region
  FROM postcode2region
 WHERE ab.entry_postcode regexp concat("^", postcode_prefix, "[:digit:]*")
 ORDER BY postcode_prefix DESC LIMIT 1

您说要从region表中获取postcode2region,其中postcode_prefixentry_postcode表中address_book的前缀。

如果我理解正确,您的查询应该看起来像这样:

SELECT region
  FROM postcode2region, (SELECT entry_postcode FROM address_book)
 WHERE entry_postcode regexp concat("^", postcode_prefix, "[:digit:]*")
 ORDER BY postcode_prefix DESC LIMIT 1

这可以为您提供地址簿中任何邮政编码前缀的区域(限制为1行)。这是你想要的吗?

请注意,在您的原始查询中,您还按fenqcon.encon_id进行了过滤,但此处除了LIMIT 1之外没有过滤器。