Php 当MySQL中的表为空时,SELECT MAX()返回的结果是什么?

Php 当MySQL中的表为空时,SELECT MAX()返回的结果是什么?,php,mysql,select,return-value,max,Php,Mysql,Select,Return Value,Max,我有一张用户付款表。我需要为每笔交易指定一个收据代码,所以我需要知道最后一笔是什么?如果没有以前的收据,我想添加第一个带有1000的收据,其他收据必须是增量的,如1001102, 为此,我编写了以下代码: $receipt = '1000'; $query_receipt = mysql_query("SELECT MAX(receipt) FROM tbl_payments"); $max = mysql_result($query_receipt,0); if ($max != '0' ||

我有一张用户付款表。我需要为每笔交易指定一个收据代码,所以我需要知道最后一笔是什么?如果没有以前的收据,我想添加第一个带有1000的收据,其他收据必须是增量的,如1001102,
为此,我编写了以下代码:

$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()…
返回的值,即使表为空。

您可以通过使用
IFNULL
实现这一点,如下所示:

SELECT IFNULL(MAX(receipt), 1000) FROM tbl_payments;
您将获得一个空值:

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**<代码>函数中移开,而移到。它更安全,功能也更多。

我还建议使用自动增量值,并通过插入id确定当前收据编号。只需执行
insert
-查询,然后使用例如获取插入付款的id

如果要以值1000开始,可以更改自动增量列的开始值。我发现这是为了设置从1000开始的自动增量

ALTER TABLE tbl_name AUTO_INCREMENT = 1000

以下内容应作为insert语句使用。无需使用PHP运行上述两个查询,您可以直接在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)
)

如果您需要为每个添加的行增加一个值,那么您应该使用一个自动递增列,而不是自己尝试生成ID?你不指望1。那么,当表为空时,您期望的输出是什么呢?实际上,重新阅读这个问题,我认为OP希望插入一行,如果没有一行的基值为1000。我不认为用一个查询就可以做到这一点,但你的SQL功夫比我的要好:)令人印象深刻的人,我也坚持了这一点。尝试了那么多,然后尝试停止,我在这里。。。非常感谢。