Redis中的SQL JOIN(FT模块或其他解决方案)

rryofs0p  于 2023-04-19  发布在  Redis
关注(0)|答案(1)|浏览(141)

我想把部分SQL查询转移到redis,遇到了redis没有类似JOIN功能的问题
SQL中的示例。得到2个表:

CREATE TABLE `games` (
    `id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
    `fname` CHAR(64) NOT NULL DEFAULT '',
    ...
);

CREATE TABLE `log` (
    `id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
    `fgame_id` CHAR(64) NOT NULL DEFAULT ''
    `finfo` MEDIUMTEXT NOT NULL
    ...
);

将通过游戏ID获得游戏名称:

SELECT log.fgame_id, games.fname, log.finfo
FROM log
LEFT JOIN games ON games.id = log.fgame_id

在Redis中,我创建了具有相同名称和类似结构的索引:

FT.CREATE games
  ON HASH
    PREFIX 1 "games:"
  SCHEMA
    id        TAG SORTABLE
    fname     TEXT SORTABLE

FT.CREATE log
  ON HASH
    PREFIX 1 "log:"
  SCHEMA
    id        TAG SORTABLE
    fgame_id  TEXT SORTABLE
    finfo     TEXT NOINDEX

是否可以在REDIS(FT.SEARCH/FT.AGGREGATE)上实现SQLJOIN方法?

deyfvvtc

deyfvvtc1#

不支持直接从Redis使用搜索加入。按照你的例子,你可以使用2个不同的PREFIX来Map不同的数据表(游戏:和log:)。例如:

FT.CREATE idx ON HASH PREFIX 2 "games:" "log:" SCHEMA "id" as id TAG "text" as text TEXT "price" as price NUMERIC

以及使用共享密钥添加数据:

HSET games:1 id 1000 text IndianaJones
HSET games:2 id 2000 text Starwars

HSET log:1 id 1000 price 199
HSET log:2 id 2000 price 399

最后使用FT.AGGREGATE返回joint表,如:

FT.AGGREGATE idx "@id:{1000}" LOAD 2 @text @price
1) "1"
2) 1) "text"
   2) "IndianaJones"
3) 1) "price"
   2) "199"

希望能作为一种变通方法有所帮助:-)

相关问题