Tôi có 2 bảng:
t1
:
+----+-------+------+
| id | n_data | loại |
+----+-------+------+
| 1 | 10 | 1 |
+----+-------+------+
t2
:
+-----+------+
| loại | tối đa |
+------+-----+
| 1 | 50 |
+------+-----+
Điều tôi muốn làm là: khi người dùng chọnt1
khi một phần tử của , chẳng hạn nhưsố hiệu = 1
, tôi thêm tương ứngn_dữ liệu
tăng thêm 1 trừ khi đạt được t2
giá trị tương ứng trong tối đa
(sử dụng tham gia
t1.type = t2.type
). Trong trường hợp này tôi sẽ cảnh báo người dùng.
Tôi có:
$result = $conn->query("CHỌN t1.n_data, t2.max
TỪ t1, t2
NƠI t1.type = t2.type VÀ t1.id = " . $id);
$row = $result->fetch_assoc();
nếu ($row["n_data"] < $row["max"]) {
$conn->query("CẬP NHẬT t1
ĐẶT n_data = n_data + 1
NƠI id = " . $id);
}
khác {
echo "Chúng ta đã đạt đến mức tối đa!";
}
Rõ ràng, tôi có một điều kiện chạy đua ở đây. Những người khác có thể thêm vào giữa hai hướng dẫn MySQL n_dữ liệu
。
Làm cách nào tôi có thể kết hợp hai truy vấn thành một hoặc biến chúng thành nguyên tử?
Tôi nghĩ tôi sẽ sử dụng mệnh đề Where tối đa
Cập nhật bảng:
cập nhật t1
đặt n_data=n_data+1
Ở đâu
id = :id và
n_dữ_liệu < :tối_đa;
Sau đó bạn có thể kiểm tra các hàng bị ảnh hưởng. Nếu là 0, điều đó có nghĩa là đã đạt đến giá trị tối đa và quá trình cập nhật không thành công.
Nhưng tất nhiên, tốt nhất là không nên tối đa
Được truyền dưới dạng tham số nhưng được truy vấn nội tuyến:
cập nhật t1
đặt n_data=n_data+1
Ở đâu
id = :id và
n_data < (chọn max từ t2 trong đó t2.type=t1.type);
Toàn bộ mã PHP sẽ rất đơn giản. Chỉ cần chạy bản cập nhật này và kiểm tra các hàng bị ảnh hưởng == 0 và lặp lại thông báo lỗi trong trường hợp đó. Một cái gì đó như thế này:
$stmt = $conn->chuẩn bị("
cập nhật t1
đặt n_data=n_data+1
Ở đâu
id = ? và
n_data < (chọn max từ t2 trong đó t2.type=t1.type)");
$stmt->bind_param("tôi", $id);
$stmt->execute([$id]);
nếu ($stmt->num_rows === 0) {
echo "Chúng ta đã đạt đến mức tối đa!";
}
Tôi là một lập trình viên xuất sắc, rất giỏi!