Php 使SQL查询的第一个和最后一个结果唯一的最佳方法是什么?

Php 使SQL查询的第一个和最后一个结果唯一的最佳方法是什么?,php,mysql,sql,css,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

我有一个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=(“从'table'中选择*限制为0,1000”);
$q=$conn->prepare($sql);
$q->execute($Executarray);
$q->setFetchMode(PDO::FETCH_两者);
$i=0;
$total=$q->rowCount();
而($r=$q->fetch()){
$i++;
//第一个结果
如果($i==1){
回显“$r['id']”;
回显“$r['image']”;
回显“$r['text']”;
//最后结果
}elseif($i==$total){
回显“$r['somethingelse']”;
//所有其他结果
}否则{
回显“$r['image']”;
回显“$r['text']”;
}
}

有没有这样的方法…?

$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>";
$sql=(“从'table'中选择*限制为0,1000”);
$q=$conn->prepare($sql);
$q->execute($Executarray);
$q->setFetchMode(PDO::FETCH_两者);
//第一个结果
“回声”$r[0]['id']。"";
“回声”$r[0]['image']。"";
“回声”$r[0]['text']。"";
//结果2-999

而($i您可以使用更智能的CSS选择器,如和

css:

html:


结果1

结果2

... 结果n-1

结果n

祝你好运!

编辑: 最简单的方法是在打印时更改
for
while
循环。我会在
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
    }
}

对于($i=0;$i这可能是一种方式,任何其他组件都会做得差不多。这只是一个节省您一些写作的提示:

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

”$r['id']。

”; }
与其提取1000行数据,为什么不进行两次sql调用?一次用于查询第一条记录:

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

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

这就是说,它只会为您节省极少的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>";
}
$sql=(“从'table'中选择*限制为0,1000”);
$q=$conn->prepare($sql);
$q->execute($Executarray);
$q->setFetchMode(PDO::FETCH_两者);
$i=0;
$total=$q->rowCount();
//第一个结果
如果($total>0){
$r=$q->fetch();
回显“$r['id']”;
回显“$r['image']”;
回显“$r['text']”;
}
//中间结果
对于($i=2;$ifetch();
回显“$r['image']”;
回显“$r['text']”;
}
//最后结果
如果($total>1){
$r=$q->fetch();
回显“$r['somethingelse']”;
}


另外,请注意for循环中有一个隐式IF:
$1fetch()
来控制while循环。我更怀疑这会为您节省多少cpu时间。如果不测量实际的cpu周期,它甚至可能无法测量。

选择器是更好的主意,但没有想到这一点:)这不是仍然是1000个IF语句吗?是的,我不认为在这里使用1000个IF有什么特别的错误,就是这样。或者你有CSS选项。那只是…表面上的修复:)
$i++
在循环开始时?@webarto:这有什么不对?您已经将问题从简单的颜色更改更改为一个全新的输出。如果您想要与您正在做的完全不同的更改,则可以。@Madmartigan如果您在循环内部中断/继续,并且您想知道实际执行了多少次迭代,该怎么办。@我们巴托,如果你打破了一个循环,你想知道你在做哪一项呢?我想我把我的例子简化了。我更新了它。它不适用于CSS。我更新了我的答案,提供了更多的细节。你想在循环中做一些测试,打印出结果。有没有办法像第二个例子I j这样做ust补充道?@Supercolville你已经在那个例子上做了。不过我看不出这两个问题之间有什么区别——我猜只是按照它们的打印顺序。你可以在我的答案中对if/else if/else语句重新排序,以达到同样的目的。它实际上是
红色
蓝色
:)谢谢:)当我意识到我自己编了颜色的时候,OP改变了这个问题,这正是我想知道的…3个sql调用会比1000个更有效吗?伙计,不要!这将是slooooow:)@supercolville-No.
IF
是极其微不足道的。连接到数据库、身份验证、发送sql字符串、解析、处理和传输结果,所有这些都多次使用网络流量,这听起来比IF语句所需的几个本地CPU周期要多得多。主要区别在于,如果您经常调用,将1000行返回给web应用程序将消耗更多的带宽,并且将是一个sql繁重的进程。如果您正在寻找到DB的单程行程,您可以使用SELECT(从(从<代码>表格<代码>限制0,1000)tmp顺序按id限制1选择id)作为<代码>第一个<代码>,(从(从<代码>表格<代码>限制0,1000)tmp顺序按id描述限制1选择id)作为
last
如果您的id始终保证有序,您也可以使用:选择MIN(id)作为
first
,选择MAX(id)作为
last
FROM(从
表中选择id
限制0,1000)tmpOk其速度大致相同。。。哈哈。根据我运行的5个10000行测试,平均快0.1秒。我想我会保留IF的。
SELECT id FROM (SELECT id FROM `table` LIMIT 0, 1000) tmp ORDER BY id DESC LIMIT 1
$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>";
}