在文章表中
title varchar(255),
category int(11),
processed enum('yes', 'no'),
... other columns
,我想处理行(SELECT
一行,然后UPDATE
)。但是,我需要针对所有类别进行各种各样的操作。不随机处理,例如一个类别的所有记录,但没有其他记录。
基本案例:处理每个类别的x行。
高级案例:为每个类别(在其表格中)定义每日限额。这与抓取工具类似,因为我们定义了在给定时间段内应为网域抓取的页数。
示例:
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中的一个,依此类推。我希望逐步处理所有类别。
答案 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;
//查询运行 `