我目前正在使用以下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>
我确信它应该可以在一个查询中完成,但我还没有设法解决它。如果没有,我会以两个查询的方式进行。
任何帮助都将不胜感激。
答案 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_prefix
是entry_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
之外没有过滤器。