考虑以下“推文”(左)和“转推”(右)表:
+----------+-----------------+ +----------+----+
| tweet_id | text | | tweet_id | rt |
+----------+-----------------+ +----------+----+
| 1 | foo {RT|123} bar| | 1 | 123|
| 2 | foobar | | 3 | 456|
| 3 | {RT|456} baz | | 4 | 789|
| 4 | bazbar {RT|789} | +----------+----+
| 5 | bar baz |
+----------+-----------------+
推文表包含数百万条预处理的推文。在一些推文中,添加了{RT | xx} 形式的自定义标签,xx为17到20的数字。转推表目前是空的,但需要按照所示进行填充:tweets.text应扫描{RT | xx}标签,如果找到,则应从标签中提取数字并将其插入转推表中tweet_id。
为此,我开始选择所有包含{RT} -labels的推文:
SELECT * FROM tweets WHERE `text` LIKE '%{RT|%'
第二步是在PHP中循环结果集并使用正则表达式从标签中过滤数字,然后执行INSERT INTO操作。然而,这需要花费很多时间 - 让我想知道使用SQL查询这可能会更快吗?如果是这样,查询将会是什么样子?我以前从未在SQL语句中使用正则表达式。
答案 0 :(得分:1)
也许这样(未经测试);
SELECT SUBSTR(
`text`,
LOCATE('{RT|', `text`) + 4,
LOCATE('}', `text`, LOCATE('{RT|', text) )
)
FROM `tweets`
WHERE `text` LIKE '%{RT|%';
答案 1 :(得分:1)
如果你的数据库是MySQL,你可以使用简单的查询来实现:
INSERT INTO `retweets` SELECT id, SUBSTR(`text`, LOCATE('{RT|', `text`)+4, LOCATE('}', `text`) - LOCATE('{RT|', `text`)-4) AS `num` FROM `tweets` HAVING `num` REGEXP '^[0-9]+$';
答案 2 :(得分:0)
这将在oracle中起作用:
SELECT tweet_id, REGEXP_SUBSTR(REGEXP_SUBSTR(text, '[{RT|][^}]+'), '[[:digit:]]+') FROM tweets WHERE text LIKE '%{RT|%'