1

HandlerSocketsを使用するときにクエリから受け取りたいフィールドを指定できますか?

ここに私のサンプルテーブルがあります

CREATE TABLE pushed_media
(
    user_id BINARY(12) NOT NULL,
    story_id BINARY(12) NOT NULL,
    sent_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    PRIMARY KEY ( user_id, story_id )
);

それを照会するPHPコードは以下のとおりです

$hs = new HandlerSocket($host, $port);
if (!($hs->openIndex(1, $dbname, $table, HandlerSocket::PRIMARY, 'user_id,story_id,sent_date')))
{
    echo $hs->getError(), PHP_EOL;
    die();
}

$user_id = pack('H*', substr(md5('ruslan'), 0, 24));
$story_id = pack('H*', substr(md5('story1'), 0, 24));

$retval = $hs->executeSingle(1, '=', array($user_id, $story_id), 1, 0);

必要なのはsent_date、他の 2 つの値を既に知っているからです。再度ネットワーク経由で転送しないようにすることはできますか?

4

2 に答える 2

5

openIndexメソッドのfieldパラメーターで指定するだけで、クエリから受け取りたいフィールドを指定できます。ここで 読むことができるように、このコード:

<?php
$hs->openIndex(1, 'db', 'table', 'PRIMARY', 'k,v');
$ret = $hs->executeSingle(1, '>=', array('K1'));
var_dump($ret);
?>

次の SQL ステートメントと同等です。

SELECT k,v FROM table WHERE k >= 'K1' LIMIT 1

sent_dateフィールド値のみを読み取りたい場合は、例に戻ります。

$hs = new HandlerSocket($host, $port);
if (!$hs->openIndex(1, $dbname, $table, myHandlerSocket::PRIMARY, 'sent_date')) {
    die($hs->getError());
}

$user_id  = pack('H*', substr(md5('ruslan'), 0, 24));
$story_id = pack('H*', substr(md5('story1'), 0, 24));

$retval = $hs->executeSingle(1, '=', array($user_id, $story_id), 1, 0);
die("<pre>".print_r($retval,true)."</pre>");

結果の出力は次のようになります。

Array
(
    [0] => 0
    [1] => 1
    [2] => 2013-02-01 22:18:39
)

HandlerSocket プロトコルのドキュメントには次のように記載されています。

「open_index」リクエストが発行されると、HandlerSocket プラグインは指定されたインデックスを開き、クライアント接続が閉じられるまで開いたままにします。開いている各インデックスは、<indexid> で識別されます。<indexid> がすでに開いている場合、古い開いているインデックスは閉じられます。<dbname> <tablename> <indexname> の同じ組み合わせを複数回、異なる <columns> で開くことができます。効率を上げるために、<indexid> はできるだけ小さくしてください。

于 2013-02-02T20:42:38.903 に答える
0

どうexecuteMultiですか?

$retval = $hs->executeMulti(array(
  array(1, '=', array($user_id), 1, 0),
  array(2, '=', array($story_id), 1, 0),
));
于 2013-01-30T11:54:59.050 に答える