3

ユーザーの支払いの表があります。トランザクションごとにレシートコードを指定する必要があるので、最後のレシートコードを知る必要がありますか?以前の領収書がない場合は、最初の領収書に1000を追加し、他の領収書は1001、1002、...のように増分する必要があります。
このために、次のコードを記述しました。

$receipt = '1000';
$query_receipt = mysql_query("SELECT MAX(receipt) FROM tbl_payments");
$max = mysql_result($query_receipt,0);
if ($max != '0' || $max != '')
{
    $receipt = mysql_result($query_receipt,0) + 1;
}

テーブルにレコードがある場合は正常に機能します。ただし、テーブルが空の場合は1を返します。どうすればこの問題を解決できますか?SELECT MAX() ...テーブルが空の場合でも、戻り値を知る必要があります。

4

4 に答える 4

3

null 値を取得します。

mysql> create table noRows (id int(3));
Query OK, 0 rows affected (0.03 sec)

mysql> select max(id) from noRows;
+---------+
| max(id) |
+---------+
|    NULL |
+---------+
1 row in set (0.00 sec)

ただし、合体を使用して必要なものを取得できます。

mysql> select coalesce(max(id),1) from noRows;
+---------------------+
| coalesce(max(id),1) |
+---------------------+
|                   1 |
+---------------------+
1 row in set (0.01 sec)

編集:ユーザーが既に持っていることを確認したい場合、そうでない場合は、新しい行を挿入するために、私の知る限り、単一のクエリでは実行できませんが、次のように動作するはずです:

$receipt = 1000;
$query_receipt = mysql_query("SELECT MAX(receipt) FROM tbl_payments");
$num_rows = mysql_num_rows($query_receipt);
if($num_rows>0)
{
    // Assumes $ID to be some unique field used to identify your customer stored in field ID.
    $sql="insert into tbl_payments (ID, receipt) values ($ID, $receipt)";
    mysql_result($sql)
}
else
{
    // Do stuff here to get the receipt from the first resultset.
}

mysql_*その点で、古い非推奨の関数から離れて、代わりにPDOに移行することを検討することをお勧めします。それははるかに安全で、より多くの機能を備えています。

于 2012-08-27T08:12:27.707 に答える
2

auto_increment 値を使用し、insert_id で現在のレシート番号を判断することもお勧めします。-Query を実行しINSERT、その後、たとえばmysqli_insert_idを使用して、挿入された支払いの ID を取得します。

値 1000 から開始する場合は、自動インクリメント列の開始値を変更できます。1000から始まる自動インクリメントを設定するためにこれを見つけました

ALTER TABLE tbl_name AUTO_INCREMENT = 1000
于 2012-08-27T09:11:45.120 に答える
0

以下は、挿入ステートメントとして機能するはずです。上記のように PHP を使用して 2 つのクエリを実行する必要はありません。同じ結果を MYSQL で直接実行できます。

INSERT INTO tbl_payments (receipt)
VALUES 
(
(SELECT CASE WHEN MAX(p.receipt) IS NULL THEN 1000 ELSE MAX(p.receipt)+1 END AS receipt 
    FROM tbl_payments p ORDER BY p.receipt DESC LIMIT 1)
)
于 2013-04-09T17:47:47.577 に答える