2011-11-02 15 views
5

Acabo de aprender acerca de sql joins y cosas, y tengo una pregunta.php sql update join

¿Se puede UNIR en una consulta de actualización? O es solo para los seleccionados. Porque tengo este código;

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

Se escoge a partir de la tabla usersonline todos los que son mayores de 5 minutos, a continuación, los encuentra en la tabla users y actualiza su registro.

No soy un asistente de JOIN ni nada, pero creo que una unión simplificaría eso. ¿Alguien puede aclarar esto?

Respuesta

4

Usando IN:

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

Usando JOIN:

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

Usando EXISTS:

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

También podría saltar el 5 minutes ago cálculos en PHP y dejar que el motor de MySQL hacer que el trabajo, con:

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

Legit, incluso podría ir un paso más allá y calcular la diferencia de la marca de tiempo en la capa de MySQL. –

+0

+1 La solución ideal IMO –

2

Sí, usted puede participar en una declaración UPDATE, pero probablemente me gustaría utilizar la sub consulta IN() como se sugiere en otro lugar, ya que encontrar la sintaxis más sencillo que el siguiente incómoda JOIN:

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

Tenga en cuenta también el uso de MySQL propia DATE_SUB() por lo que no tienen que manejar eso en PHP antemano.

0

¿Te refieres a esto?

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

Debería funcionar bien.

0

Le presentaré el comando IN.

Ejemplo:

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

¿Qué vas a hacer aquí? Primero. Crea una matriz.

$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

Entonces, dos consultas con un PHP '.join()' entre, ¿es más rápido que una consulta con 'JOIN'? ¿Dónde basas ese reclamo? –

+0

Oups, no lo siento. Tu derecha estoy muy perdido aquí jaja! Quería decir que será más rápido que ejecutar una ACTUALIZACIÓN para cada usuario ... Estaba perdido en mi mente. –

+1

Ah, está bien. Sí, tu camino es aún más rápido (solo 2 consultas) que el bucle 'while 'original (n + 1 consultas). –