从SQL查询中获取第一个和最后一个结果的最佳方法是什么?

时间:2012-01-04 16:41:21

标签: php mysql sql css

我有一个SQL查询,输出1000个sql条目(有时小于1000)。我希望第一个结果和最后一个结果是唯一的。

这是最好的方法,通过IF语句运行1000次,只是为了自定义第一行和最后一行?还是有更好的方法?

示例:

$sql=("SELECT * FROM `table` LIMIT 0, 1000");
$q = $conn->prepare($sql);
$q->execute($executearray);
$q->setFetchMode(PDO::FETCH_BOTH);

$i = 0;
$total = $q->rowCount();
while ($r = $q->fetch()){

    $i++;

    // first result
    if ($i == 1) {
        echo "<div>" . $r['id'] . "</div>";
        echo "<div>" . $r['image'] . "</div>";
        echo "<div>" . $r['text'] . "</div>";

    // last result
    } elseif ($i == $total) {
        echo "<div>" . $r['somethingelse'] . "</div>";

    // all other results
    } else {
        echo "<div>" . $r['image'] . "</div>";
        echo "<div>" . $r['text'] . "</div>";
    }
}

有没有办法做这样的事情......?

$sql=("SELECT * FROM `table` LIMIT 0, 1000");
$q = $conn->prepare($sql);
$q->execute($executearray);
$q->setFetchMode(PDO::FETCH_BOTH);

// first result
echo "<div>" . $r[0]['id'] . "</div>";
echo "<div>" . $r[0]['image'] . "</div>";
echo "<div>" . $r[0]['text'] . "</div>";

// results 2-999
while ($i <= $total - 1) {
    echo "<div>" . $r['somethingelse'] . "</div>";
}

// last result
echo "<div>" . $r[$total]['image'] . "</div>";
echo "<div>" . $r[$total]['text'] . "</div>";

5 个答案:

答案 0 :(得分:3)

您可以使用更智能的CSS选择器,例如:first-child:last-child

的CSS:

#queryresults p { color: blue }
#queryresults p:first-child { color: red }
#queryresults p:last-child { color: green } 

HTML:

<div id="queryresults">
<p>result 1</p>
<p>result 2</p>
...
<p>result n-1</p>
<p>result n</p>
</div>
祝你好运!

答案 1 :(得分:2)

编辑: 最简单的方法是在打印时更改forwhile循环。我会在for循环中执行此操作,因为while循环保证您将至少有一个结果并且将始终运行,但如果没有结果,则for循环将不会运行。

for($i=0; $i<results.length; $i++){
    if($i==0){
       # do unique first thing here
    }elseif($i == results.length){
       # do unique last thing here
    } else {
       # normal
    }
}

或类似的东西。

你的意思是什么结果是独一无二的?当你在生成的HTML页面中打印出来时,你想要以不同的方式设置它们吗?

您可以使用CSS选择器。 :first-child:last-child

有关详细信息,请参阅this entry on quirksmode

答案 2 :(得分:1)

这可能是要走的路,任何其他组件都会做得非常相似。只是一个提示,为您节省一些写作:

while ($r = $q->fetch()) {
  $i++;
  echo "<p style='color:" . ($i ==1 ? 'red': $i == $total? 'blue':'green') . ";'>" . $r['id'] . "</p>"; 
} 

答案 3 :(得分:1)

通过仅将记录2循环到count-1来避免中间记录的IF。

那就是说,它只会节省你微不足道的CPU时间。你最好把精力集中在昂贵的代码上,而不是那么简单。

$sql=("SELECT * FROM `table` LIMIT 0, 1000");
$q = $conn->prepare($sql);
$q->execute($executearray);
$q->setFetchMode(PDO::FETCH_BOTH);

$i = 0;
$total = $q->rowCount();

// first result
if ($total > 0) {
    $r = $q->fetch();
    echo "<div>" . $r['id'] . "</div>";
    echo "<div>" . $r['image'] . "</div>";
    echo "<div>" . $r['text'] . "</div>";
}

// middle results
for($i=2; $i<$total; $i++){
    $r = $q->fetch();
    echo "<div>" . $r['image'] . "</div>";
    echo "<div>" . $r['text'] . "</div>";
}

// last result
if ($total > 1) {
    $r = $q->fetch();
    echo "<div>" . $r['somethingelse'] . "</div>";
}

另外,请注意for循环中有一个隐含的IF:$1<$total。你的循环使用$q->fetch()的结果控制while循环的位置。我对这将节省多少CPU时间更加怀疑。如果不测量实际的cpu周期,它可能甚至无法测量。

答案 4 :(得分:0)

为什么不进行2次SQL调用,而不是撤回1000行数据?一个查询第一条记录:

SELECT id FROM (SELECT id FROM `table` LIMIT 0, 1000) tmp ORDER BY id LIMIT 1

第二个:

SELECT id FROM (SELECT id FROM `table` LIMIT 0, 1000) tmp ORDER BY id DESC LIMIT 1