我有一个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>";
答案 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)
编辑:
最简单的方法是在打印时更改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
}
}
或类似的东西。
你的意思是什么结果是独一无二的?当你在生成的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