gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 20:59:33 25 4
gpt4 key购买 nike

我目前正在使用以下 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 服务器版本相对应的手册,了解在第 1 行 'REGEXP CONCAT("^", postcode_prefix, "[:digit:]*")) ORDER BY postcode_prefix DESC' 附近使用的正确语法

简而言之,查询应该查看存储在address_book表的entry_postcode字段中的邮政编码,仅获取该邮政编码的前导字母,然后从postcode2region表的region字段中获取匹配的数据。

我确信应该可以在单个查询中完成它,但我还没有设法解决它。如果没有,我将分两个查询来完成。

如有任何帮助,我们将不胜感激。

最佳答案

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

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

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

您说您想要从 postcode2region 表中获取 region,其中 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 之外没有任何过滤器。

关于mysql - 提取较大 mysql 查询的一部分以独立使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37356686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com