我将如何在 PHP 中将 MYSQL 行数到特定行


How would I count MYSQL rows down to a specific row in PHP?

我有一个表,充当自动排队的文件的保管箱。

我根据两件事对文件的优先级进行排序,日期和时间以及是否已验证。

这是我的查询:

$dropcount = mysql_query("SELECT COUNT(*) FROM queue WHERE status=2 OR status=3 
OR status=4 ORDER BY authorised DESC, timestamp DESC;");

我需要做的是计算用户当前文件前面有多少行,因为这将计算每一行,包括当前用户后面的文件。

谢谢。

我的表如下所示:

http://tabbidesign.com/table.png

其工作方式是,如果将文件添加到队列中。但是,如果该文件已授权,则它优先于未验证的文件,这意味着即使它是在某些未经验证的苍蝇之后添加的,也需要对其进行计数。

状态列指出文件是否为:-正在加工中

-在保管箱中排队

-由用户取消

-被管理员取消

编辑:好的,如果我执行以下操作,@curtisdf的答案将起作用:

$countauth =
SELECT COUNT(*)
FROM queue
WHERE (status=2 OR status=3 OR status=4)
AND authorised=1
AND timestamp < $timestamp
$countnorm =
SELECT COUNT(*)
FROM queue
WHERE (status=2 OR status=3 OR status=4)
AND authorised=0
AND timestamp < $timestamp
$actualcount = $countnorm + $countauth;

我怎样才能将其合并到一个查询中,或者这是不可能的?

解决方案的

SELECT COUNT(*)FROM queue WHERE (status=2 OR status=3 OR status=4)AND 
timestamp < $timestamp OR authorised=1

由@curtisdf发现。

假设您的idqueue列是主键并且它是自动递增的,那么使用它来过滤掉后来的 ID 怎么样? 像这样:

SELECT COUNT(*) 
FROM queue 
WHERE status=2 OR status=3 OR status=4 
AND idqueue < $currentFileId
ORDER BY authorised DESC, timestamp DESC

编辑:知道如何回答有点困难,因为您的表格有这么多列,并且不清楚您使用所有这些列的目的。 例如,与authorized列相比,status列是什么意思? 但无论如何,由于您的ORDER BY对于此查询无关紧要,并且由于您正在寻找在给定文件之前进入的授权文件,因此如何:

SELECT COUNT(*)
FROM queue
WHERE (status=2 OR status=3 OR status=4)
AND authorised=1
AND timestamp < $timestamp

编辑2:好的,现在我明白你在追求什么了。 :-) 如果您刚刚删除了"AND authorised=X"部分,我相信您可以在一个查询中完成。 这假定您的authorised列只有 01 的值。 但是,如果它不止于此,那么您可以通过将每个查询的WHERE ... AND ...部分包装在自己的括号中来做到这一点,如下所示:

SELECT COUNT(*)
FROM queue
WHERE (
    (status=2 OR status=3 OR status=4)
    AND authorised=1
    AND timestamp < $timestamp
) OR (
    (status=2 OR status=3 OR status=4)
    AND authorised=0
    AND timestamp < $timestamp
)

这可以进一步简化:

SELECT COUNT(*)
FROM queue
WHERE (status=2 OR status=3 OR status=4)
AND timestamp < $timestamp
AND (authorised=1 OR authorised=0)

您需要添加 where 语句:

$dropcount = mysql_query("SELECT COUNT(*) FROM queue WHERE (status=2 OR status=3
OR status=4) AND authorised=1 and timestamp<'$currentUserTimeStamp'  ORDER BY 
authorised DESC, timestamp DESC;");

如果您不知道当前用户时间戳,则需要先选择该时间戳。

$result = mysql_query("select `timestamp` from queue where (status=2 or status=3 or 
status=4) and `userid`='$user'");
$row = mysql_fetch_row($result);
$currentUserTimeStamp = $row[0];

当然,我已经为用户 id 编造了列名。