我正在为 cassandra 使用这个驱动程序:https : //github.com/datastax/php-driver
这是我用来创建表的代码:
CREATE TABLE test.packages (
packageuuid timeuuid,
ruserid text,
suserid text,
timestamp int,
PRIMARY KEY (ruserid, suserid, packageuuid, timestamp)
);
然后我创建了一个物化视图:
CREATE MATERIALIZED VIEW test.packages_by_userid
AS SELECT * FROM test.packages
WHERE ruserid IS NOT NULL
AND suserid IS NOT NULL
AND TIMESTAMP IS NOT NULL
AND packageuuid IS NOT NULL
PRIMARY KEY (ruserid, suserid, timestamp, packageuuid)
WITH CLUSTERING ORDER BY (packageuuid DESC);
这是我的 PHP 代码片段,它导致 502 错误网关:
$session = $cluster->connect($keyspace);
$selectstmt = $session->prepare("SELECT suserid, susername, snickname, msg, savatar, timestamp FROM packages_by_userid WHERE ruserid IN (?, ?) AND suserid IN (?, ?) AND timestamp < ? LIMIT 40;");
$params = array('ruserid' => array($rid, $sid), 'suserid' => array($rid, $sid), 'timestamp' => $endtimestamp);
$options = array('arguments' => $params);
$future = $session->executeAsync($selectstmt, $options);
$result = $future->get();
我相信我搞砸了将参数绑定到准备好的语句。在我的情况下,这样做的正确方法是什么,因为我必须将多个值绑定到ruserid
and suserid
?
感谢任何能提供帮助的人。
我建议你改变你的数据模型,如下所示:
CREATE TABLE packages (
cnvid text,
packageuuid timeuuid,
ruserid text,
suserid text,
PRIMARY KEY (cnvid, packageuuid)
);
这cnvid
是对话ID。您可以使用以下功能制作对话 ID:
function makeConversationId($ruserid, $suserid ) {
return $ruserid <= $suserid ? $ruserid . ':' . $suserid : $suserid . ':' . $ruserid ;
}
无论发件人还是收件人,您的对话 ID 都是相同的。IE
echo makeConversationId('1', '2') . '<br/>';
echo makeConversationId('2', '1');
输出 :
1:2
1:2
现在你有了cnvid,每当你insert/update/delete/select
用上面的方法制作cnvid。
虽然 packageuuid 是 timeuuid,但你所有的 packageuuid 都会按时间排序。
因此,要查询首先创建 cnvid(即1:2
),然后使用要查询的时间戳创建一个 timeuuid(即896f8110-49d4-11e7-ade6-493d3332b999
)
检查这个:https : //datastax.github.io/php-driver/api/Cassandra/class.Timeuuid/
因此,您可以查询以获取时间戳大于给定时间戳的 1 到 2 之间的用户包:
示例数据:
cnvid | packageuuid | ruserid | suserid
-------+--------------------------------------+---------+---------
3:4 | bc0809e0-49d3-11e7-ade6-493d3332b999 | 3 | 4
1:2 | 1f4aae70-49d1-11e7-ade6-493d3332b999 | 1 | 2
1:2 | 237ff3b0-49d1-11e7-ade6-493d3332b999 | 2 | 1
询问 :
SELECT * FROM packages WHERE cnvid = '1:2' AND packageuuid < 896f8110-49d4-11e7-ade6-493d3332b999;
输出 :
cnvid | packageuuid | ruserid | suserid
-------+--------------------------------------+---------+---------
1:2 | 1f4aae70-49d1-11e7-ade6-493d3332b999 | 1 | 2
1:2 | 237ff3b0-49d1-11e7-ade6-493d3332b999 | 2 | 1
所以你不需要物化视图和查询。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句