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因为我已经知道另外两个价值观。是否可以不再通过网络传输它们?

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 回答