2016-05-20 11 views
0

私は現在、以下のmysqlクエリを使用していますが、いくつかの大きな再コーディングが行われているため、このクエリのほんの一部を使用する必要がありますそのままで。 現在のクエリは、私が使用したい部分がより大きいmysqlクエリのセクションを独立して抽出する

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

ある

$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']); 

ですが、私は一人でいることを実行する場合、それは明らかにそれが何であるか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構文にエラーがあります。 'REGEXP CONCAT( "^"、postcode_prefix、 "[:digit:] *")の近くで使用する正しい構文については、MySQLサーバのバージョンに対応するマニュアルをチェックしてください。ORDER BY postcode_prefix DESC' on line 1

In要するに、クエリは、address_bookテーブルのentry_postcodeという名前のフィールドに格納されているポストコードを見て、そのポストコードの先頭の文字だけを取り出し、postcode2regionテーブルの領域フィールドから一致するデータをフェッチすることになっています。

私はそれが単一のクエリで実行できるはずですが、私はそれを解決するために管理していないと確信しています。そうでない場合、私は2つのクエリとしてそれを行います。

ご協力いただければ幸いです。

答えて

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 

あなたはpostcode_prefixが​​テーブルからentry_postcodeの接頭辞であるpostcode2regionテーブルからregionを取得したいと言います。

私が正しく理解していれば、あなたのクエリはこの線に沿って何かを見てください。

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以外のフィルタはありません。

関連する問題