2

記事の表で

title varchar(255),
category int(11),
processed enum('yes', 'no'),
... other columns

、行を処理したい(SELECT行とその後UPDATE)。ただし、これをすべてのカテゴリに対して多様に行う必要があります。ランダムに処理しない。たとえば、あるカテゴリのすべてのレコードは処理するが、別のカテゴリのレコードは何も処理しない。

  1. 基本的なケース:カテゴリごとに x 行を処理します。

  2. 高度なケース:各カテゴリの 1 日あたりの制限を (そのテーブルで) 定義します。これはクローラーに似ています。特定の期間にドメインでクロールする必要があるページの数を定義するためです。

例:

SELECT * from articles WHERE process='no' LIMIT 1
edit the columns in PHP
UPDATE articles .... WHERE id=xx (id comes from SELECT).

テーブル:

id    title    category  process
1     title1   3         no
2     title2   3         no
3     title3   3         no
4     title4   3         no
5     title5   5         no
6     title6   5         no
7     title7   5         no

cron で定期的にクエリを実行すると、カテゴリ 3 のすべての記事が処理され、次にカテゴリ 5 が処理されます。カテゴリ 3 の記事を 1 つ、次にカテゴリ 5 の記事を 1 つ、というように処理するクエリが必要です。すべてのカテゴリから徐々に処理したいと考えています。

4

4 に答える 4

1

$n各カテゴリから選択するには:

SET @last := NULL;
SELECT * FROM (
  SELECT   *,
           @fetch:=IF(category=@last, @fetch-1, $n) x,
           @last :=category
  FROM     articles
  WHERE    process='no'
  ORDER BY category
) t WHERE t.x > 0;

テーブルからcategory関連付けられたものをそれぞれ選択するには、次のようにします。numbernumbers

SET @last := NULL;
SELECT * FROM (
  SELECT   *,
           @fetch:=IF(category=@last, @fetch-1, numbers.number) x,
           @last :=category
  FROM     articles JOIN numbers USING (category)
  WHERE    process='no'
  ORDER BY category
) t WHERE t.x > 0;

sqlfiddleでそれらを参照してください。

于 2012-05-17T18:34:15.957 に答える
1
SELECT *
FROM Table
WHERE category =
(SELECT category
FROM Table
WHERE process = 'no'
GROUP BY category
ORDER BY COUNT(category) DESC
LIMIT 1)
ORDER BY id
LIMIT 1

..処理されていない行が最も多いカテゴリの最小IDを持つ1行が表示されます。サブクエリは、process='no' 行が最も多いカテゴリを返します。

3 よりも 5 の方が多い場合、5 よりも 3 の方が多くなるまで 5 が返され続け、その後、各クエリで交互に開始されます (行を毎回 process = 'yes' としてマークしている限り)。

于 2012-05-17T17:44:19.553 に答える
0

PHPで実行される処理は、ユーザー編集またはSQLでは実行できない複雑な手順(クロール)のいずれかを伴うようなものだと思います。その場合、このクエリを使用して、articlesテーブルから必要な列を取得できます。

カテゴリごとに1つの記事:

SELECT 
    a.*
FROM 
    category AS c 
  JOIN
    articles AS a 
        ON  a.id = 
            ( SELECT id
              FROM articles AS aa
              WHERE category = c.id
                AND process = 'no'
              ORDER BY whatever
              LIMIT 1
            ) ;

次に更新します。

UPDATE
    articles
SET
    process = 'yes'
  , other_column = ...
WHERE
    id = ?              --- one of the ids you have previously 
                        --- selected and processed.
于 2012-05-17T18:40:26.300 に答える
0

egyalの更新クエリ: set variable for @n ` SET @n := 3; SET @last := NULL;

SELECT * FROM ( SELECT *, @fetch:=IF(category=@last, @fetch-1, @n) x, @last :=category FROM 記事 WHERE process='no' ORDER BY category ) t WHERE tx > 0 ;

//クエリ実行 `

于 2014-06-20T03:23:33.180 に答える