2011-11-02 20 views
5

Po prostu dowiedzieć się o sprzężeń sql i rzeczy, i mam pytanie.Aktualizacja SQL sql dołączyć

Czy można połączyć JOIN na zapytanie o aktualizację? Czy to tylko dla wybranych. Ponieważ mam ten kod;

$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]'"); 
} 

Znalazło się od stołu usersonline wszystkie te, które są starsze niż 5 minut, a następnie znajdzie je w tabeli users i aktualizuje swój rekord.

Nie jestem kreatorem JOIN ani nic, ale myślę, że łączenie to uprości. Czy ktoś może to wyjaśnić?

Odpowiedz

4

Korzystanie IN:

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

Korzystanie JOIN:

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

Korzystanie EXISTS:

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

Można również pominąć 5 minutes ago obliczenia w PHP i niech silnik MySQL zrobić, że praca w składzie:

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

Legit, można nawet posunąć się o krok dalej i obliczyć znacznik czasu w warstwie mysql. –

+0

+1 Idealne rozwiązanie IMO –

2

Tak, można przyłączyć się do instrukcji UPDATE, ale to pewnie użyć IN() podkwerenda jak sugeruje innym, jak znajdę składnię więcej prostolinijny niż niezręcznej JOIN poniżej:

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

Uwaga również użycie własnego DATE_SUB() MySQL, dzięki czemu nie trzeba obsługiwać, że w PHP wcześniej.

0

Masz na myśli?

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

Powinno działać dobrze.

0

Wprowadzę cię do polecenia IN.

Przykład:

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

Co zamierzasz zrobić tutaj? Pierwszy. Utwórz tablicę.

$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

Tak, dwa zapytania z '.join()' w PHP pomiędzy, jest szybsze niż jedno zapytanie z 'JOIN'? Gdzie opierasz to roszczenie? –

+0

Oups, nie przepraszam. Twoje prawo Jestem bardzo zagubiony tutaj lol! Chciałem powiedzieć, że będzie szybsze niż uruchomienie aktualizacji dla każdego użytkownika ... Byłem zagubiony w mojej głowie. –

+1

Ah, ok. Tak, twoja droga jest jeszcze szybsza (tylko 2 zapytania) niż oryginalna pętla 'while' (zapytania n + 1). –