【发布时间】:2011-07-20 10:08:24
【问题描述】:
我有一个查询,它获取按姓氏排序的所有记录。现在我想创建一个循环,按姓氏的第一个字母对这些结果进行分组,并在组上方显示字母,即
A
-----------
Albert
Alfred
C
-----------
Charles
D
-----------
Delta etc...
谢谢!
【问题讨论】:
我有一个查询,它获取按姓氏排序的所有记录。现在我想创建一个循环,按姓氏的第一个字母对这些结果进行分组,并在组上方显示字母,即
A
-----------
Albert
Alfred
C
-----------
Charles
D
-----------
Delta etc...
谢谢!
【问题讨论】:
在MySQL 一侧按lastname 对结果进行排序,并在PHP 一侧跟踪第一个字母的变化:
<?php
$rs = mysql_query("SELECT * FROM mytable ORDER BY lastname");
while ($rec = mysql_fetch_assoc($rs)) {
if ($initial !== strtoupper(substr($rec['lastname'], 0, 1)) {
$initial = strtoupper(substr($rec['lastname'], 0, 1));
print "$initial\n";
}
print $rec['lastname'] . "\n";
}
?>
【讨论】:
$letter = null;
foreach ($array as $word) {
if ($letter != $word[0]) {
$letter = $word[0];
echo '<b>'.strtoupper($word[0]) . '</b><br/>';
}
echo strtoupper($word) . '<br/>';
}
和游览查询添加行:
order by `your_field` asc
【讨论】:
已经尝试过类似的方法了吗?
$last = '';
foreach($data as $key=>$row){
if(substr($row['last_name'],0,1)!=$last) echo '<br /><br />'.substr($row['last_name'],0,1).'<br />----------------<br />';
$last = substr($row['last_name'],0,1);
echo $row['last_name'];
}
【讨论】:
在您看来,您可以循环记录并拆分它们:
$current = '';
foreach ($rows as $r) {
if (!$current || strtolower($r['name'][0]) != $current) {
$current = strtolower($r['name'][0]);
echo strtoupper($current).'<br />---------------';
}
echo $row['name'].'<br />';
}
【讨论】:
在您的查询中,尝试添加如下内容:
group by substr(last_name,1,1)
即
select substr(last_name,1,1) as alpha, *
from tableName
group by substr(last_name,1,1)
【讨论】:
ORDER BY LEFT(last_name,1) ASC。顺便说一句..只要您想查询所有行,您将无法检索此类“被阻止”的结果。最后你必须在你的代码中做最后的“阻塞”。
是的,您可以使用 MySql 本身来实现这一目标
在我的情况下,brand_name 将按照您的预期列出。
例子:
SELECT id, upper(SUBSTR(brand_name, 1, 1)) AS alpha FROM products WHERE brand_name != '' group by alpha
UNION
SELECT id, upper(SUBSTR(brand_name, 1, 1)) AS alpha FROM products WHERE brand_name != '' order by brand_name COLLATE NOCASE
结果:
A
A Card
A Cef
A Cef O
B
Bacticef Tab
Bacticin
Bactidrox
Bactidrox Kid
........
希望对某人有所帮助。
【讨论】: