php sql update присоединиться - PullRequest
6 голосов
/ 03 ноября 2011

Просто узнаю о SQL-соединениях и прочем, и у меня есть вопрос.

Можете ли вы присоединиться к запросу на обновление? Или это только для избранных. Потому что у меня есть этот код;

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

Он выбирает из таблицы usersonline всех старше 5 минут, затем находит их в таблице users и обновляет их запись.

Я не волшебник JOIN или что-то еще, но я думаю, что объединение упростит это. Может кто-нибудь уточнить это?

Ответы [ 4 ]

5 голосов
/ 03 ноября 2011

Использование IN:

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

Использование JOIN:

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

Использование EXISTS:

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

Вы также можете пропустить 5 minutes ago вычисления в PHP и позволить движку MySQL сделать эту работу с помощью:

WHERE timestamp < NOW() - INTERVAL 5 MINUTE
2 голосов
/ 03 ноября 2011

Да, вы можете ПРИСОЕДИНЯТЬСЯ в операторе UPDATE, но я бы, вероятно, использовал подзапрос IN (), как предложено в другом месте, так как я нахожу синтаксис более простым, чем неловкий JOIN ниже:

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

Обратите внимание также на использование собственной MySQL DATE_SUB(), поэтому вам не нужно заранее обрабатывать это в PHP.

0 голосов
/ 03 ноября 2011

Я познакомлю вас с командой IN.

Пример:

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

Что ты собираешься делать здесь? Первый. Создать массив.

$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 голосов
/ 03 ноября 2011

Ты имеешь в виду, как это ??

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

Должно работать хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...