在多个匹配行存在时排序和限制

时间:2013-09-12 05:31:31

标签: mysql sorting sql-order-by limit

我有问题。我的查询在下面给出

"SELECT
mail
FROM
table2
INNER JOIN
table1 ON table2.wid = table1.id
WHERE
table1.time_stamp >= DATE_SUB(NOW(),INTERVAL 10 MINUTE)
AND
table1.status<>200
GROUP BY
table1.Id
ORDER BY
table1.time_stamp ASC
LIMIT 2"

我认为大多数人都有使用此查询的目的。我一次只需要获取2个项目来发送电子邮件(但是当出现下面提到的问题时,查询将不会向一个用户发送邮件) 。

我的问题是当3行具有相同的time_stamp值时,它会打印从前一个开始的前两个,但它从不提取第三个。我不想错过电子邮件通知中的任何用户。 如何解决此问题?

2 个答案:

答案 0 :(得分:0)

您已在查询结果中提到LIMIT为2.删除它以获取所有结果或将其更改为3.

我更改了SELECT以添加更多列,以便在运行时轻松检查结果。

SELECT table1.Id, table1.time_stamp, mail
FROM table2 INNER JOIN table1 ON table2.wid = table1.id
WHERE
     table1.time_stamp >= DATE_SUB(NOW(),INTERVAL 10 MINUTE)
     AND table1.status<>200
GROUP BY table1.Id
ORDER BY table1.time_stamp ASC
LIMIT 3

答案 1 :(得分:0)

听起来你想分批做这些。您可以use OFFSET控制结果中的开始位置:

SELECT
mail
FROM
table2
INNER JOIN
table1 ON table2.wid = table1.id
WHERE
table1.time_stamp >= DATE_SUB(NOW(),INTERVAL 10 MINUTE)
AND
table1.status<>200
GROUP BY
table1.Id
ORDER BY
table1.time_stamp ASC
LIMIT 2
OFFSET 2

例如,这将检索第二组两行。如果以编程方式设置偏移值,则可以使用它来遍历整个结果集,同时一次只检索两个。

我相信MySQL也仅通过LIMITLIMIT <offset>, <limit>的形式支持这一点。

但是,如果我没有指出这样做是多么低效和毫无意义,那将是我的疏忽。