2

私はスクリプトをより高速にしようとしていますが、以前は PHP で行われていた計算を SQL 内に含めることにしました。insert使用するかどうか、またはupdateコードで必要かどうかを決定する if ステートメントを作成する必要があります。

IF (EXISTS (SELECT * FROM `edenteva` WHERE `Time`='1340252716' and `Code`='571119'))
THEN IF (EXISTS (SELECT * FROM `map` WHERE `mega`='571119'))
THEN UPDATE `map` SET `edenteva`='571119' WHERE `mega`='571119'
ELSE INSERT INTO `map`(`mega`,`edenteva`) VALUES ('571119','571119');

しかし、構文エラーが発生しています。何が問題なのかわかりますか?

1064 - SQL 構文にエラーがあります。edenteva'IF (EXISTS (SELECT * FROM WHERE Time='1340252716' and Code='57111' at line 1) の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

4

3 に答える 3

2

さて、あなたはあなたの質問で答えを出します:check the manual...

IF ステートメント: http://dev.mysql.com/doc/refman/5.5/en/if-statement.html

EXISTS ステートメント: http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

ヒント: 通常の条件式 IF THEN ELSE と SQL クエリ内の IF ステートメントを混同していますが、これは異なります。

于 2012-06-23T00:29:23.733 に答える
1

map.megaにインデックスが定義されている場合UNIQUE(またはそれが a の場合PRIMARY KEY)、次のように使用できますON DUPLICATE KEY UPDATE

INSERT INTO TABLE map (mega, edenteva)
VALUES ('571119','571119')
ON DUPLICATE KEY UPDATE edenteva = '571119';

別のテーブルに行があるときにのみ更新または挿入を行いたい場合は、値のソースとして他のテーブルを使用できます。

INSERT INTO map (mega, edenteva)
  SELECT code, code
  FROM edenteva
  WHERE time = '1340252716' AND code = '571119'
ON DUPLICATE KEY UPDATE edenteva = VALUES(edenteva) ;

古き良き SQL フィドル: http://sqlfiddle.com/#!2/9bb19/1

于 2013-04-30T21:45:11.170 に答える
0

IF THEN ELSE は、mysql ランドのストアド プログラム用です...

so は次のようにしか使用できません :( したがって、あなたや他の人がもっと期待している人にとっては朗報ではありません...

DELIMITER //

CREATE FUNCTION SimpleCompare(n INT, m INT)
  RETURNS VARCHAR(20)

  BEGIN
    DECLARE s VARCHAR(20);

    IF n > m THEN SET s = '>';
    ELSEIF n = m THEN SET s = '=';
    ELSE SET s = '<';
    END IF;

    SET s = CONCAT(n, ' ', s, ' ', m);

    RETURN s;
  END //

DELIMITER ;
于 2013-04-29T14:14:21.417 に答える