2012-03-12 3 views
1

これをSELECTしてすぐに削除するのが最も効率的な方法は何でしょうか。最も効率的な方法はSELECTを選択し、すぐにこれを削除する

SELECT * from `usersOnline` WHERE timestamp>NOW()-INTERVAL 5 SECOND ORDER BY rand() LIMIT 1; 

この同じ選択クエリをどのようにして、最も効率的に選択したものを削除することができますか?あなたは、このネストされたクエリのよう

+0

関連:http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=158486 –

+0

それはあなたが同じテーブルからクエリの結果を削除したいですか? – Bradmage

答えて

1
$query = 'SELECT * FROM `usersOnline` WHERE timestamp>NOW()-INTERVAL 5 SECOND ORDER BY rand() LIMIT 1;'; 
$result = mysql_query($query); 
$record = mysql_fetch_assoc($result); 
$query = 'DELETE FROM `usersOnline` WHERE id = ' . $record['id']; 
mysql_query($query); 

を、あなたは1、その後、他の操作を行う必要があります。選択結果のキーを使用して、その後にそのレコードを直接削除します。この例では、主キー列の名前が "id"であると仮定しています。 mysqql関数を、もちろんデータベースにアクセスするために使用しているメソッドに置き換えます。

+0

は十分に単純です。それが私がやることです。しかし、私はそれを行う1つのクエリの方法や私が気づいていなかったかもしれないと思った。ありがとう! – brybam

0

使用は。DELETE FROM

DELETE 
FROM SomeTable 
WHERE EXISTS 
(SELECT * from `usersOnline` WHERE timestamp>NOW()-INTERVAL 5 SECOND ORDER BY rand() LIMIT 1; 
) 

おかげで行うことができます

+0

私は彼が両方の結果を取得して削除することを選択したいと思うと思う。 – dqhendricks

0

私はこの例では、通常のステートメントで準備されたステートメントが混在していることを知っています。しかし、コードを書く方法は開発者次第です。これは概念の証明に過ぎず、簡単に読むことができます。

$mysqli = new mysqli('localhost', 'user', 'password', 'userTable'); 

$result = $mysqli->query("SELECT * from `usersOnline` WHERE timestamp>NOW()-INTERVAL 5 SECOND ORDER BY rand() LIMIT 1"); 

$stmt = $mysqli->prepare("DELETE FROM 'usersOnline WHERE id = ?"); 

while ($row = mysql_fetch_assoc($result)) { 
    $stmt->bind_param('i', $row["id"]); 
    $stmt->execute(); 
} 
$stmt->close(); 

$mysqli->close(); 
+0

もし 'id'が唯一の必須フィールドであれば、なぜ' select * 'を使うのでしょうか。 –

+0

OPはユーザデータを使いたいと思うからです。このように、whileループの内部では、必要に応じて余分なコードを使用してデータを処理できます。 – Bradmage

関連する問題