如何在mysql查询中选择每个类别的记录?

时间:2012-05-17 16:31:29

标签: mysql select web-crawler

在文章表中

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

,我想处理行(SELECT一行,然后UPDATE)。但是,我需要针对所有类别进行各种各样的操作。不随机处理,例如一个类别的所有记录,但没有其他记录。

  1. 基本案例:处理每个类别的x行。

  2. 高级案例:为每个类别(在其表格中)定义每日限额。这与抓取工具类似,因为我们定义了在给定时间段内应为网域抓取的页数。

  3. 示例:

    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中的一个,然后处理类别5中的一个,依此类推。我希望逐步处理所有类别。

4 个答案:

答案 0 :(得分: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最小。 subbquery返回具有最多process ='no'行的类别。

如果你有超过5s的5s,这将持续给你5s,直到有3s而不是5s然后它将开始与每个查询交替(只要你将行标记为process ='yes'每次)。

答案 1 :(得分: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表中为每个number选择关联的numbers

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上查看。

答案 2 :(得分:0)

我认为在PHP中完成的处理是一些让用户编辑或SQL无法完成的复杂过程(爬行)的事情。在这种情况下,您可以使用此查询从articles表中获取所需的列。

每个类别一篇文章:

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.

答案 3 :(得分:0)

更新 eggyal 的查询:为@n设置变量 ` SET @n:= 3; SET @last:= NULL;

SELECT * FROM(   选择 *,            @fetch:= IF(category = @ last,@ fetch-1,@ n)x,            @last:=类别   来自文章   WHERE process ='no'   ORDER BY类别 )t WHERE t.x> 0;

//查询运行 `