0

次の「ツイート」(左)と「リツイート」(右)の表について考えてみます。

  +----------+-----------------+     +----------+----+
  | 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}ラベルを持つすべてのツイートを選択することから始めました。

SELECT * FROM tweets WHERE `text` LIKE '%{RT|%'

2番目のステップは、PHPで結果セットをループし、正規表現を使用してラベルから数値をフィルター処理してから、INSERTINTO操作を実行することです。ただし、これにはかなりの時間がかかります。SQLクエリを使用した方がおそらく高速になるのではないかと思います。もしそうなら、クエリはどのように見える必要がありますか?これまで、SQLステートメントで正規表現を操作したことはありません。

4

3 に答える 3

1

たぶんこのように(テストされていない);

SELECT SUBSTR(
    `text`,
    LOCATE('{RT|', `text`) + 4,
    LOCATE('}', `text`, LOCATE('{RT|', text) )
)
FROM `tweets`
WHERE `text` LIKE '%{RT|%';
于 2012-04-06T14:01:17.373 に答える
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]+$';
于 2012-04-06T14:36:45.430 に答える
0

これはオラクルで機能します:

SELECT tweet_id, REGEXP_SUBSTR(REGEXP_SUBSTR(text, '[{RT|][^}]+'), '[[:digit:]]+') FROM tweets WHERE text LIKE '%{RT|%'
于 2012-04-06T14:14:56.010 に答える