检查mysql查询结果以运行第一个查询结果中不可用的第二个查询

时间:2012-02-17 16:36:32

标签: php mysql

我有这段代码:

$sql = "SELECT ns, id FROM `dns` WHERE `ns` = 1 LIMIT 0, 30 ";       
$result = mysql_query($sql);

// After this I need to run second query which is not available in first query. Help me with this please.
$sql2 = "SELECT ns, id FROM `dns` WHERE `ns` = 1 AND `id` = not available in first query, how to do that? LIMIT 0, 30 ";         
$result = mysql_query($sql);

// I can then echo my first query result here 
// I can then echo my second query result here 

我需要做的是检查第一个结果以运行第二个查询。我设定了目的限制。例如,如果第一个查询中的id从1到30可用。第二个查询将查询id,例如从31到60。

我希望你能理解我想说的话。提前谢谢。

UPDATE :我需要使用查询结果进行挖掘查找。查询结果是nameserver。因为挖掘响应速度是随机的,所以我想我想拆分例如:30个名称服务器的结果和运行3个同时挖掘查找。这就是为什么第二个查询(名称服务器)结果在第一个查询结果中不可用,第三个查询结果在第二个查询结果中不可用。我需要使用所有3个结果供以后使用。我真的很感激你的回应。谢谢。

5 个答案:

答案 0 :(得分:3)

您只需更改LIMIT标准即可。有一个“OFFSET”选项(您在第一个查询中指定为0)。使用您的示例,以下就足够了。

$sql = "SELECT ns, id FROM `dns` WHERE `ns` = 1 LIMIT 0, 30 ";       
$result = mysql_query($sql);

// After this I need to run second query which is not available in first query. Help me with this please.
$sql2 = "SELECT ns, id FROM `dns` WHERE `ns` = 1 LIMIT 30, 30 ";         
$result = mysql_query($sql);

第二个查询将从偏移量开始30并返回30多行,因此在这种情况下,行31-60

修改 根据您更新的问题,一个更明智的方法是简单地做

$sql = "SELECT ns, id FROM `dns` WHERE `ns` = 1 LIMIT 0, 90 ";       
$result = mysql_query($sql);

然后让PHP将行拆分为根据需要分离服务器的请求,从而确保没有重复项并在PHP和MySQL之间来回减少。

答案 1 :(得分:1)

如果你只需要抓住接下来的30行,为什么不呢:

LIMIT 30, 30

关于第二个问题?

有关LIMIT的信息,请参阅http://dev.mysql.com/doc/refman/5.1/en/select.html#id838627

  

使用两个参数,第一个参数指定的偏移量   第一行返回,第二行指定最大数量   要返回的行。

请注意,如果您想更清楚,也可以将其写为LIMIT 30 OFFSET 30。所以:

$sql = "SELECT ns, id FROM `dns` WHERE `ns` = 1 LIMIT 30 OFFSET 30";
$result = mysql_query($sql);

如果您的ids /查询只是示例,而您真正需要的是从一个从不同查询中排除结果集的集合中选择的查询,那么您可以使用如下子查询:

SELECT ns, id
FROM `dns`
WHERE `ns` = 1
AND `id` NOT IN (
    SELECT `id`
    FROM `dns`
    WHERE `ns` = 1
    LIMIT 0, 30
)
LIMIT 0, 30

首先,内部子查询将运行并返回一个id列表。这组ID将明确地从外部查询中排除,因为我们指定了NOT IN (...)

答案 2 :(得分:0)

NOT IN与子查询一起使用,如下所示:

SELECT ns, id FROM `dns` WHERE `ns` = 1 AND `id` NOT IN 
(SELECT ns, id FROM `dns` WHERE `ns` = 1 LIMIT 0, 30) 
LIMIT 0, 30

答案 3 :(得分:0)

那么你的问题是什么?

你为什么不做一个子选择或加入?

答案 4 :(得分:0)

为什么不在没有限制的情况下进行第一次查询,然后用for循环或其他东西提取前30个结果。

保存两个查询。

所以

$query = SELECT ns, id FROM dns WHERE ns = 1
$result = mysql_query($query);

for ($i=0;$i<30;$i++) {
//Do Stuff with mysql_fetch_row...
}

for ($i=0;$i<30;$i++) {
//Do more stuff
}

除非有理由不能立刻得到所有结果?

编辑:很明显,如果你肯定只想要60个结果,你可以在查询中添加LIMIT 60