3

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

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

这是我的查询:

$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

它的工作方式是如果将文件添加到队列中。但是,如果该文件被授权,它优先于未经验证的文件,这意味着它需要被计算在内,即使它是在一些未经验证的苍蝇之后添加的。

状态列说明文件是否为: - 正在处理

- 在 Dropbox 中排队

- 被用户取消

- 被管理员取消

编辑:好的@curtisdf's answer如果我做了以下工作:

$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 发现。

4

2 回答 2

2

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

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

编辑:知道如何回答有点困难,因为您的表格有很多列,而且不清楚您将所有列用于什么。status例如,与该列相比,该列是什么意思authorized?但是无论如何,由于您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列仅具有0or的值1。但如果它有更多,那么你可以通过将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)
于 2012-06-12T23:51:11.047 回答
2

您需要添加 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 编好了列名。

于 2012-06-12T23:53:25.147 回答