2011-11-02 43 views
5

Chỉ cần tìm hiểu về tham gia sql và mọi thứ, và tôi có một câu hỏi.php sql cập nhật tham gia

Bạn có thể THAM GIA truy vấn cập nhật không? Hoặc nó chỉ dành cho những người được chọn. Bởi vì tôi có mã này;

$five_ago = date("Y-m-d H:i:s", strtotime("$now - 5 mins")); 

$sql_result23 = mysql_query("SELECT * FROM usersonline WHERE timestamp < '$five_ago'", $db); 
while ($rs23 = mysql_fetch_array($sql_result23)) { 
    mysql_query("UPDATE users SET status='gone' WHERE id ='$rs23[userID]'"); 
} 

Nó nhấc ra khỏi usersonline bảng tất cả những người mà lớn tuổi hơn 5 phút, sau đó tìm thấy chúng trong bảng users và cập nhật hồ sơ của họ.

Tôi không phải là thuật sĩ THAM GIA hoặc bất kỳ điều gì nhưng tôi nghĩ rằng việc tham gia sẽ đơn giản hóa điều đó. Ai đó có thể làm rõ điều này?

Trả lời

4

Sử dụng IN:

UPDATE users 
SET status='gone' 
WHERE id IN 
     (SELECT userID 
     FROM usersonline 
     WHERE timestamp < '$five_ago' 
    ) 

Sử dụng JOIN:

UPDATE users 
    JOIN usersonline 
    ON usersonline.userID = users.id 
SET users.status='gone' 
WHERE usersonline.timestamp < '$five_ago' 

Sử dụng EXISTS:

UPDATE users 
SET status='gone' 
WHERE EXISTS 
     (SELECT * 
     FROM usersonline 
     WHERE timestamp < '$five_ago' 
      AND userID = users.id 
    ) 

Bạn cũng có thể bỏ qua 5 minutes ago tính toán trong PHP và để cho các cơ MySQL làm điều đó làm việc, với:

WHERE timestamp < NOW() - INTERVAL 5 MINUTE 
+0

Đúng, bạn thậm chí có thể tiến thêm một bước nữa và tính toán chênh lệch dấu thời gian ở lớp mysql. –

+0

+1 Giải pháp lý tưởng IMO –

2

Vâng, bạn có thể JOIN trong một tuyên bố UPDATE, nhưng tôi có lẽ sẽ sử dụng IN() subquery như đề xuất ở nơi khác, như tôi đã tìm ra cú pháp hơn đơn giản hơn vụng JOIN dưới đây:

UPDATE users 
    JOIN usersonline ON users.id = usersonline.userid 
    SET users.status='gone' 
WHERE usersonline.timestamp < DATE_SUB(NOW(), INTERVAL 5 MINUTE); 

cũng lưu ý việc sử dụng MySQL của riêng DATE_SUB() vì vậy bạn không cần phải xử lý đó trong PHP trước.

0

Ý bạn là như thế này ??

UPDATE users, usersonline 
SET users.status='gone' 
WHERE users.id ='$rs23[userID]' 
AND usersonline.timestamp < '$five_ago'; 

Nên hoạt động tốt.

0

Tôi sẽ giới thiệu bạn với lệnh IN.

Ví dụ:

WHERE id IN(1,2,3,4,5,6) 

Những gì bạn sẽ làm gì đây? Đầu tiên. Tạo một mảng.

$five_ago = date('Y-m-d H:i:s', strtotime("$now - 5 mins")); 

$Array = array(); 

$sql_result23 = mysql_query('SELECT * FROM `usersonline` WHERE `timestamp` < "'.$five_ago.'"', $db); 
while ($rs23 = mysql_fetch_assoc($sql_result23)){ 
    $Array[] = $rs23['userID']; 
} 

mysql_query('UPDATE `users` SET `status`= "gone" WHERE `id` IN ('.join(',', $Array).')'); 
+0

Vì vậy, hai truy vấn với PHP '.join()' ở giữa, nhanh hơn một truy vấn với 'JOIN'? Bạn xác nhận quyền sở hữu ở đâu? –

+0

Oups, xin lỗi. Quyền của bạn Tôi rất mất ở đây lol! Tôi muốn nói sẽ nhanh hơn sau đó chạy một UPDATE cho mỗi người dùng ... Tôi đã bị mất trong tâm trí của tôi. –

+1

Ah, ok. Có, cách của bạn vẫn nhanh hơn (chỉ có 2 truy vấn) so với vòng lặp 'while' ban đầu (n + 1 truy vấn). –