Php 使SQL查询的第一个和最后一个结果唯一的最佳方法是什么?
我有一个SQL查询,它输出1000个SQL条目(有时少于1000个)。我希望第一个结果和最后一个结果是唯一的 最好的方法是通过IF语句运行1000次,只定制第一行和最后一行吗?还是有更好的办法 示例: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=("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>";
}