2012-07-13 32 views
9

Tôi cố gắng để kết hợp hai câu hỏi này trong python xoắn:MySQL: trở về cập nhật hàng

SELECT * FROM table WHERE group_id = 1013 and time > 100; 

và:

UPDATE table SET time = 0 WHERE group_id = 1013 and time > 100 

vào một truy vấn duy nhất. nó có khả thi để làm vậy không?

Tôi đã thử đặt SELECT trong truy vấn phụ, nhưng tôi không nghĩ rằng toàn bộ truy vấn trả lại cho tôi những gì tôi muốn.

Có cách nào để thực hiện việc này không? (thậm chí tốt hơn, không có truy vấn phụ) Hoặc tôi chỉ phải gắn bó với hai truy vấn?

cảm ơn,

Quan

+2

Đây là những khái niệm hai hành động khác nhau. Bạn đang cố gắng gì để đạt được bằng cách nào đó kết hợp chúng? – Wiseguy

+0

Tôi đang cố gắng truy vấn nhanh nhất có thể, vì nó sẽ xử lý các tải nặng. –

+1

Vâng, bạn không thể kết hợp các truy vấn này. Để tối ưu hóa tốc độ, hãy chắc chắn lập chỉ mục các bảng của bạn một cách chính xác. ['EXPLAIN'] (http://dev.mysql.com/doc/refman/5.5/en/using-explain.html) sẽ giúp thông báo cho bạn về những thứ cần tối ưu hóa. – Wiseguy

Trả lời

3

Bạn không thể kết hợp trực tiếp các truy vấn này. Nhưng bạn có thể viết một thủ tục được lưu trữ thực hiện cả hai truy vấn. Ví dụ:

delimiter | 
create procedure upd_select(IN group INT, IN time INT) 
begin 
    UPDATE table SET time = 0 WHERE group_id = @group and time > @time; 
    SELECT * FROM table WHERE group_id = @group and time > @time; 
end; 
| 
delimiter ; 
+3

Sau khi cập nhật các hàng mà Squall Leohart muốn trả về có thời gian = 0, vì vậy lệnh SELECT với điều kiện thời gian> @time sẽ không hoạt động như mong đợi. – md2perpe

5

Rõ ràng mysql không có cái gì đó có thể được sử dụng, đặc biệt là nếu bạn đang chỉ cập nhật một hàng.

Ví dụ này là từ: http://lists.mysql.com/mysql/219882

UPDATE mytable SET 
mycolumn = @mycolumn := mycolumn + 1 
WHERE mykey = 'dante'; 

SELECT @mycolumn; 

Tôi chưa bao giờ cố gắng này mặc dù, nhưng đừng cho tôi biết làm thế nào bạn nhận được trên.

+0

cảm ơn, nhưng tôi muốn trả lại nhiều hàng –

2

Vì vậy, những gì bạn đang cố gắng làm là thiết lập lại time bằng không bất cứ khi nào bạn truy cập vào một hàng - loại giống như một kích hoạt, nhưng MySQL không thể làm trigger sau SELECT.

Có lẽ cách tốt nhất để làm điều đó với một yêu cầu máy chủ từ ứng dụng là viết một thủ tục được lưu trữ cập nhật và sau đó trả về hàng. Nếu nó rất quan trọng để có hai xảy ra với nhau, bọc hai báo cáo trong một giao dịch.

1

Có một phiên bản nhanh hơn của sự trở lại của hàng cập nhật và chính xác hơn khi giao dịch với hệ thống nạp cao yêu cầu để thực hiện các truy vấn cùng lúc trên máy chủ cơ sở dữ liệu cùng

update table_name WITH (UPDLOCK, READPAST) 
SET state = 1 
OUTPUT inserted. 
+1

Tôi tin rằng điều này chỉ hoạt động trên MS SQL. Bài viết liên quan đến MySQL. – PromInc

Các vấn đề liên quan