2012-01-25 12 views
0

私は現在、投票機能付きのアプリケーションを開発中です。私は人々がサインインしてシンプルにしないようにしたいので、投票ごとにIPを収集します。この機能により、IPは同じことに決して再び投票しません。ダブルMySQLクエリ

しかし、IPによって投票されていないSELECTの投票は難しいです。私はこれを試しました:

SELECT * FROM messages 
WHERE state = '-1' 
    AND id != (SELECT message_id FROM log WHERE ip = '$ip') 

私はこれを正しく行いますか?

+0

この方法を使用する際に発生する何をしたか難しさ? –

+0

スキーマを投稿し、このクエリの目的を明確にしてください。また、IPはアイデンティティの非常に貧弱なメカニズムです。それを再考してください。 – cheeken

+3

IPによるフィルタリングは、任意のプロバイダ、いくつかのISPなどのほとんどすべてのモバイルユーザである一般的なNATゲートウェイを共有するすべてのユーザをホースします。 –

答えて

4

私が正しくあなたを理解している場合 - このクエリはあなたを助ける必要があります。

SELECT messages.* FROM messages 
LEFT JOIN log ON log.message_id = messages.id AND log.ip = '$ip' 
WHERE state = '-1' AND log.ip IS NULL 
+0

ではありません! – Hedam

0
SELECT * FROM messages 
WHERE state = '-1' 
    AND id NOT IN (SELECT message_id FROM log WHERE ip = '$ip') 

は、あなたが言うことを行いますが、私はそれはあなたがやりたいことはありません、非常にポジティブだ:例えば典型的なセルタワーの1人の移動ユーザーしか投票することはできませんが、信号を失い、別の場所でそれを再集計した後、再度投票できるようになります。

0
$qry = "SELECT * FROM messages " . 
"WHERE state = '-1' AND NOT EXISTS (SELECT 1 FROM log WHERE log.message_id = messages.id ". 
"AND ip = '" . $ip . "')"; 

A(NOT)EXISTSは通常より速く表現よりもある

+0

'A(NOT)EXISTSは通常、IN式より高速です ' - 誰がそう言ったのですか?それは**多くの要因に依存します** – zerkms