私のストアド プロシージャは、MySQL クエリで間違った変数を読み取っています。プロシージャの本体を使用するだけで、必要な結果が得られます。これをストアドプロシージャにしたいと思います。
SQLyog の SP は次のとおりです。
DELIMITER $$
USE `XXXXXXXXXXXXXXX`$$
DROP PROCEDURE IF EXISTS `getcusbyzip`$$
CREATE DEFINER=`XXXXXXXXXXXXXXX`@`%` PROCEDURE `getcusbyzip`(IN zipcode VARCHAR(30), IN radius VARCHAR(30))
BEGIN
SELECT C.CustomerName, C.MenuId
FROM Customers C
INNER JOIN (
SELECT ZIPCODE, ( 3959 * ACOS( COS( RADIANS( (
SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =zipcode
LIMIT 0 , 1
) ) ) * COS( RADIANS( LAT ) ) * COS( RADIANS( LNG ) - RADIANS( (
SELECT Z.LNG
FROM ZipCodes Z
WHERE Z.ZIPCODE =zipcode
LIMIT 0 , 1
) ) ) + SIN( RADIANS( (
SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =zipcode
LIMIT 0 , 1
) ) ) * SIN( RADIANS( LAT ) ) ) ) AS distance
FROM ZipCodes
HAVING distance <radius
ORDER BY distance
) AS RelevantCodes ON ( C.ZIPCODE = RelevantCodes.ZIPCODE );
END$$
DELIMITER ;
このタイプの問題が解決されるまで、今のところ顧客を 1 人しか追加していないため、返す必要があるレコードは 1 つだけです。ここで私は突破口を見つけました(笑わないでください、私はSQLにまったく慣れていません:))。
パラメータのTYPEも変更してみました。郵便番号をINTに変更した後、郵便番号が壊れたので、これを使用しました:
CALL getcusbyzip(08361,50)
結果の行は、郵便番号に「8361」が含まれるすべての行でした。基本的に、なぜこれほど多くの行が返されたのかについての私の個人的な説明はこれだけです。
両方のパラメーターを VARCHAR タイプに設定してこれを使用すると、次のようになります。
CALL getcusbyzip(08361,50)
また
CALL getcusbyzip('08361',50)
また
CALL getcusbyzip(08361,'50')
あなたはポイントを取得します。
1行を戻す必要があるときに、0行を戻します。
だから今、私は自分の問題が何であるかを知っていると思います。うまくいけば、実際にそれを尋ねるかもしれません. SP が入力をパラメーターとして読み取るのとは、クエリを実行してパラメーターを手動でクエリに入力した場合とは異なる方法で読み取られる原因は何ですか。第 2 に、MySQL サーバーが私のプロシージャーを私のクエリと同じように読み取りますが、coarse のパラメーターを使用するようにするには、どうすればプロシージャーを調整できますか?
以下は、完全に正常に機能するクエリです。
SELECT C.CustomerName, C.MenuId
FROM Customers C
INNER JOIN (
SELECT ZIPCODE, ( 3959 * ACOS( COS( RADIANS( (
SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =08360
LIMIT 0 , 1
) ) ) * COS( RADIANS( LAT ) ) * COS( RADIANS( LNG ) - RADIANS( (
SELECT Z.LNG
FROM ZipCodes Z
WHERE Z.ZIPCODE =08360
LIMIT 0 , 1
) ) ) + SIN( RADIANS( (
SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =08360
LIMIT 0 , 1
) ) ) * SIN( RADIANS( LAT ) ) ) ) AS distance
FROM ZipCodes
HAVING distance <50
ORDER BY distance
) AS RelevantCodes ON ( C.ZIPCODE = RelevantCodes.ZIPCODE )
編集:
もう1つの注意点は、変数を変更してSP(ストアドプロシージャ)の情報を直接変更しても修正されないため、MySQLプロシージャロジックに欠けているものでなければならないことです。正直なところ、ストアドプロシージャにあるという理由だけで結果が異なる理由がわかりません。