我的数据库有很多包含客户信息的列,其中一些是重复的。 我需要根据IP地址(已知)更新表的“sale”字段,但仅限于具有此类IP地址的最新条目。
这是我的表:
|Sale | IP | Date |
+-----+-------------+----------+
|0 | 109.86.75.1 |2015-12-01|
|0 | 109.86.75.2 |2015-12-05|
|0 | 109.86.75.2 |2015-12-12|
|0 | 109.86.75.4 |2015-12-13|
假设我需要使用ip = 109.86.75.2向客户添加更改, 我需要在第三行将Sale更改为1,因为有两个具有此类IP的条目,但第三行的时间是最新的。
更新后表格应如下所示:
|Sale | IP | Date |
+-----+-------------+----------+
|0 | 109.86.75.1 |2015-12-01|
|0 | 109.86.75.2 |2015-12-05|
|1 | 109.86.75.2 |2015-12-12|
|0 | 109.86.75.4 |2015-12-13|
我使用这样的PHP代码:
<?php
$servername=...;
$username=...;
$password=...;
$dbname=...;
$ipaddress="109.86.75.2";
$conn = new mysqli($servername, $username, $password, $dbname);
$sql="UPDATE MY_DATABASE_TABLE
SET Sale='1'
WHERE ip_address = '$ipaddress' AND //Don't know what to add here in where condition...
if ($conn->query($sql) === TRUE) {
echo "Record updated successfully";
}
else {
echo "Error updating record: " . $conn->error;
}
$conn->close();
?>
我在AND之后尝试了这个,但它不起作用:
date IN (SELECT max(date) FROM MY_DATABASE_TABLE)";
“更新记录时出错:您无法在FROM子句中为更新指定目标表'MY_DATABASE_TABLE'”
非常感谢您的帮助! 提前谢谢!
答案 0 :(得分:0)
您可以使用带有LEFT JOIN的UPDATE:
UPDATE
MY_DATABASE_TABLE t1 LEFT JOIN MY_DATABASE_TABLE t2
ON t1.ip_address=t2.ip_address
AND t1.date<t2.date
SET
t1.Sale='1'
WHERE
t1.ip_address = '109.86.75.2'
AND t2.date IS NULL
当连接失败时,t2.date为NULL:该行是唯一具有该ip_address的行,或者是具有最大日期的行。
请查看小提琴here。