Làm cách nào để trừ hai giá trị từ các bảng khác nhau trong MySQL?

Được rồi, vì vậy tôi đã thử sử dụng trình bao dòng lệnh trên bảng kiểm tra của mình với incomeValue và costValue trong hai hàng riêng biệt. Tôi thấy rằng nó đi ra với kết quả chính xác. Đây là những giá trị tôi đã nhập

sqlite> INSERT INTO income VALUES (NULL, "2020.10.06", 21.00, 00.00);              

sqlite> INSERT INTO income VALUES (NULL, "2020.10.06", 00.00, 10.00);

Sau đó tôi đã thêm một truy vấn

sqlite> SELECT SUM(incomeValue)-(SELECT SUM(expenseValue) FROM income) FROM income WHERE timeStamp == "2020.10.06"; 

Trong đó 11 được xuất ra

Tuy nhiên, truy vấn này dường như vẫn không hoạt động trong chương trình của tôi. Tôi đang sử dụng sublime text 3 làm chương trình với corona làm trình giả lập. Đây là những gì toàn bộ tuyên bố là

local currentBalance = db:exec([[SELECT SUM(incomeValue)-(SELECT SUM(expenseValue) FROM income) FROM income;]])

print(currentBalance)

Tôi không biết liệu có lỗi cú pháp nào khác ở đây không?

Mình có 2 bàn, đồ và đã bán. Trong bảng mặt hàng tôi có itemid , tên mặt hàng , số lượng và trong bảng đã bán tôi có itemid , peopleid , itemname , soldquantity. Tôi muốn đầu ra là itemid, itemname,remquantity(quantity-soldquantity) và đầu ra cuối cùng sẽ lưu trữ ở đâu?

2) Bảng ghi chú giao hàng DNOTE_TABLE. Có trường. DNOTE_NO, material_no,quantity, user_id và nhiều hơn nữa

Bây giờ chúng tôi có một yêu cầu, đó là chúng tôi phải tạo một báo cáo chứng khoán có

Material_No , User_ID, Total_Available_Qty

Ở đây, Tổng số lượng có sẵn được tính bằng cách trừ Số lượng bảng chứng khoán với số lượng bảng Ghi chú giao hàng

bạn có thể hỗ trợ hình thành truy vấn chọn không

tôi đã sử dụng Tham gia trái nhưng không nhận được số lượng chính xác cũng như các giá trị âm được điền vào Total_available_Qty. Truy vấn của tôi như sau

SELECT  DISTINCT INV.material_no,INV.USER_ID, (SUM(INV.quantity) - SUM(PICK.quantity)) AS TOT_QTY  
FROM INV_TABLE  INV LEFT JOIN 
DNOTE_TABLE  PICK ON INV.USER_ID = PICK.USER_ID AND INV.material_no = PICK.material_no 
WHERE  INV.quantity NOT IN ('0') 
GROUP BY INV.material_no, INV.USER_ID ORDER BY TOT_QTY 

I. e. về cơ bản ở đây như trong hình, tất cả các bản ghi bảng kiểm kê sẽ được tìm nạp để lại các bản ghi bảng ghi chú chuyển giao

Nó có thể được hiểu với sự trợ giúp của một ví dụ trong đó hai bảng có một số giá trị và chúng tôi trừ các giá trị với sự trợ giúp của LEFT JOIN. Ở đây chúng tôi đang lấy hai bảng có dữ liệu sau -

mysql> Select * from value_curdate;
+----+----------+-------+
| Id | Product  | Price |
+----+----------+-------+
| 1  | Notebook | 100   |
| 2  | Pen      | 40    |
| 3  | Pencil   | 65    |
+----+----------+-------+
3 rows in set (0.00 sec)

mysql> Select * from value_prevdate;
+----+-----------+-------+
| Id | Product   | Price |
+----+-----------+-------+
| 1  | Notebook  | 85    |
| 2  | Pen       | 34    |
| 3  | Pencil    | 56    |
| 4  | Colors    | 65    |
| 5  | Fevistick | 25    |
+----+-----------+-------+
5 rows in set (0.00 sec)

Hai bảng trên lần lượt có giá hiện tại và giá trước đó của sản phẩm. Bây giờ, truy vấn sau đây, bằng cách sử dụng LEFT JOIN, sẽ tìm thấy sự khác biệt về giá giữa các sản phẩm giống nhau được lưu trữ trong cả hai bảng

mysql> Select value_curdate.id, value_curdate.product, value_curdate.price as Curprice,value_prevdate.price as 'prevprice', value_curdate.price-value_prevdate.price as 'Difference' from value_curdate LEFT JOIN value_prevdate ON value_curdate.id = value_prevdate.id ;
+----+----------+----------+-----------+------------+
| id | product  | Curprice | prevprice | Difference |
+----+----------+----------+-----------+------------+
| 1  | Notebook | 100      | 85        | 15         |
| 2  | Pen      | 40       | 34        | 6          |
| 3  | Pencil   | 65       | 56        | 9          |
+----+----------+----------+-----------+------------+
3 rows in set (0.00 sec)

Làm cách nào để trừ hai giá trị từ các bảng khác nhau trong MySQL?


Làm cách nào để trừ hai giá trị từ các bảng khác nhau trong MySQL?

btw tôi muốn hỏi, có cách nào để sql có thể tự động tạo bảng hoặc cột bổ sung để xem sự khác biệt/kết quả của phép trừ không?

cảm ơn

Giải pháp tốt nhất

Bạn có thể trực tiếp thực hiện các thao tác trên nhiều cột và hiển thị kết quả đó trong một cột mới mà bạn có thể đặt tên bằng mệnh đề as. Bạn có thể thực hiện thao tác nối để thực hiện giữa hai cột của các bảng khác nhau theo cách tương tự. Để trả lời câu hỏi của bạn, sau đây là truy vấn SQL

SELECT a.id, a.amount-b.amount as Difference FROM table1 a
INNER JOIN table2 b
ON a.id=b.id

Giải pháp liên quan

Sql – Chèn vào… giá trị ( CHỌN … TỪ … )

Cố gắng

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2  

Đây là ANSI SQL tiêu chuẩn và sẽ hoạt động trên mọi DBMS

Nó chắc chắn hoạt động cho

  • tiên tri
  • Máy chủ MS SQL
  • mysql
  • postgres
  • SQLite v3
  • siêu dữ liệu
  • DB2
  • Sybase
  • Vertica
  • HSQLDB
  • H2
  • AWS RedShift
  • SAP HANA
  • Google Spanner

Php – Cách ngăn SQL injection trong PHP

Cách chính xác để tránh các cuộc tấn công SQL injection, bất kể bạn sử dụng cơ sở dữ liệu nào, là tách dữ liệu khỏi SQL, để dữ liệu vẫn là dữ liệu và sẽ không bao giờ được trình phân tích cú pháp SQL diễn giải thành các lệnh. Có thể tạo câu lệnh SQL với các phần dữ liệu được định dạng chính xác, nhưng nếu bạn không hiểu đầy đủ chi tiết, bạn nên luôn sử dụng câu lệnh đã chuẩn bị sẵn và truy vấn được tham số hóa. Đây là các câu lệnh SQL được máy chủ cơ sở dữ liệu gửi đến và phân tích cú pháp riêng biệt với bất kỳ tham số nào. Bằng cách này, kẻ tấn công không thể tiêm SQL độc hại

Về cơ bản, bạn có hai lựa chọn để đạt được điều này

  1. Sử dụng PDO (đối với mọi trình điều khiển cơ sở dữ liệu được hỗ trợ)

    ________số 8_______
  2. Sử dụng MySQLi (dành cho MySQL)

     $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
     $stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'
    
     $stmt->execute();
    
     $result = $stmt->get_result();
     while ($row = $result->fetch_assoc()) {
         // Do something with $row
     }
    

Nếu bạn đang kết nối với cơ sở dữ liệu không phải MySQL, thì có tùy chọn thứ hai dành riêng cho trình điều khiển mà bạn có thể tham khảo (ví dụ:

"SELECT ( SELECT amount FROM table1 ) - ( SELECT amount FROM table2 ) AS difference"
0 và
"SELECT ( SELECT amount FROM table1 ) - ( SELECT amount FROM table2 ) AS difference"
1 cho PostgreSQL). PDO là tùy chọn phổ quát


Thiết lập kết nối chính xác

Lưu ý rằng khi sử dụng PDO để truy cập cơ sở dữ liệu MySQL, các câu lệnh chuẩn bị thực không được sử dụng theo mặc định. Để khắc phục điều này, bạn phải tắt mô phỏng các câu lệnh đã chuẩn bị. Một ví dụ về việc tạo kết nối bằng PDO là

$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'password');

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Trong ví dụ trên, chế độ lỗi không thực sự cần thiết, nhưng bạn nên thêm nó vào. Bằng cách này, kịch bản sẽ không dừng lại với một số

"SELECT ( SELECT amount FROM table1 ) - ( SELECT amount FROM table2 ) AS difference"
2 khi có sự cố xảy ra. Và nó mang lại cho nhà phát triển cơ hội để
"SELECT ( SELECT amount FROM table1 ) - ( SELECT amount FROM table2 ) AS difference"
3 bất kỳ (các) lỗi nào là
"SELECT ( SELECT amount FROM table1 ) - ( SELECT amount FROM table2 ) AS difference"
4n dưới dạng
"SELECT ( SELECT amount FROM table1 ) - ( SELECT amount FROM table2 ) AS difference"
5 giây

Tuy nhiên, điều bắt buộc là dòng

"SELECT ( SELECT amount FROM table1 ) - ( SELECT amount FROM table2 ) AS difference"
6 đầu tiên, yêu cầu PDO tắt các câu lệnh đã chuẩn bị được mô phỏng và sử dụng các câu lệnh đã chuẩn bị thực sự. Điều này đảm bảo câu lệnh và các giá trị không được PHP phân tích cú pháp trước khi gửi nó đến máy chủ MySQL (khiến kẻ tấn công không có cơ hội tiêm SQL độc hại)

Mặc dù bạn có thể đặt

"SELECT ( SELECT amount FROM table1 ) - ( SELECT amount FROM table2 ) AS difference"
7 trong các tùy chọn của hàm tạo, điều quan trọng cần lưu ý là các phiên bản 'cũ' của PHP (trước 5. 3. 6) âm thầm bỏ qua tham số bộ ký tự trong DSN


Giải trình

Câu lệnh SQL bạn chuyển đến

"SELECT ( SELECT amount FROM table1 ) - ( SELECT amount FROM table2 ) AS difference"
8 được máy chủ cơ sở dữ liệu phân tích cú pháp và biên dịch. Bằng cách chỉ định các tham số (hoặc là một tham số
"SELECT ( SELECT amount FROM table1 ) - ( SELECT amount FROM table2 ) AS difference"
9 hoặc một tham số được đặt tên như
SELECT a.id, a.amount-b.amount as Difference FROM table1 a
INNER JOIN table2 b
ON a.id=b.id
0 trong ví dụ trên), bạn cho công cụ cơ sở dữ liệu biết nơi bạn muốn lọc. Sau đó, khi bạn gọi
SELECT a.id, a.amount-b.amount as Difference FROM table1 a
INNER JOIN table2 b
ON a.id=b.id
1, câu lệnh đã chuẩn bị được kết hợp với các giá trị tham số mà bạn chỉ định

Điều quan trọng ở đây là các giá trị tham số được kết hợp với câu lệnh đã biên dịch, không phải là chuỗi SQL. SQL injection hoạt động bằng cách lừa tập lệnh bao gồm các chuỗi độc hại khi nó tạo SQL để gửi đến cơ sở dữ liệu. Vì vậy, bằng cách gửi SQL thực riêng biệt với các tham số, bạn sẽ hạn chế rủi ro kết thúc bằng thứ mà bạn không có ý định

Bất kỳ tham số nào bạn gửi khi sử dụng câu lệnh đã chuẩn bị sẽ chỉ được coi là chuỗi (mặc dù công cụ cơ sở dữ liệu có thể thực hiện một số tối ưu hóa để tất nhiên, tham số cũng có thể kết thúc dưới dạng số). Trong ví dụ trên, nếu biến

SELECT a.id, a.amount-b.amount as Difference FROM table1 a
INNER JOIN table2 b
ON a.id=b.id
2 chứa
SELECT a.id, a.amount-b.amount as Difference FROM table1 a
INNER JOIN table2 b
ON a.id=b.id
3 thì kết quả sẽ chỉ là tìm kiếm chuỗi
SELECT a.id, a.amount-b.amount as Difference FROM table1 a
INNER JOIN table2 b
ON a.id=b.id
4 và bạn sẽ không nhận được một bảng trống

Một lợi ích khác của việc sử dụng các câu lệnh đã chuẩn bị là nếu bạn thực hiện cùng một câu lệnh nhiều lần trong cùng một phiên thì nó sẽ chỉ được phân tích cú pháp và biên dịch một lần, giúp bạn tăng tốc độ

Ồ, và vì bạn đã hỏi về cách thực hiện cho phần chèn, đây là một ví dụ (sử dụng PDO)

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute([ 'column' => $unsafeValue ]);

Câu lệnh đã chuẩn bị có thể được sử dụng cho các truy vấn động không?

Mặc dù bạn vẫn có thể sử dụng các câu lệnh đã chuẩn bị cho các tham số truy vấn, nhưng bản thân cấu trúc của truy vấn động không thể được tham số hóa và một số tính năng truy vấn nhất định không thể được tham số hóa

Đối với những trường hợp cụ thể này, điều tốt nhất cần làm là sử dụng bộ lọc danh sách trắng để hạn chế các giá trị có thể

Làm cách nào để trừ hai bảng trong mysql?

mysql> CHỌN Id TỪ tab1
TRÁI THAM GIA tab2 SỬ DỤNG (Id)
Ở ĐÂU tab2. ID LÀ NULL;

Chúng ta có thể trừ hai bảng trong SQL không?

MINUS so sánh dữ liệu trong hai bảng và chỉ trả về các hàng dữ liệu sử dụng các cột được chỉ định tồn tại trong bảng đầu tiên nhưng không tồn tại trong bảng thứ hai . Có thể nhận được tất cả các kết quả từ bảng thứ hai không tồn tại trong bảng đầu tiên bằng cách chuyển đổi thứ tự bảng trong truy vấn.

Làm cách nào để sử dụng toán tử TRỪ trong mysql?

Toán tử này được sử dụng để cộng trừ một số với một số khác. .
ví dụ 1. Sau đây là một ví dụ về toán tử "-" − mysql> SELECT 4156456-56445; . 4156456-56445. +---------------+. 4100011. +----------------+ 1 hàng trong tập hợp (0. 00 giây)
ví dụ 2. .
ví dụ 3

Làm cách nào để trừ hai giá trị trong Oracle?

Sau đây minh họa cú pháp của toán tử Oracle MINUS. .
CHỌN cột_list_1 TỪ T1 TRỪ CHỌN cột_list_2 TỪ T2;
CHỌN last_name TỪ địa chỉ liên hệ TRỪ CHỌN last_name TỪ nhân viên ĐẶT HÀNG THEO họ;
CHỌN product_id TỪ sản phẩm TRỪ CHỌN product_id TỪ hàng tồn kho;