我有一个使用CFQUERY创建的长客户列表。我想在列表上方显示字母A到Z作为锚点,当选择一个时,转到客户列表上的那个位置。我不知道该怎么做。有什么建议吗?
答案 0 :(得分:2)
您可以使用SQL LEFT() 获取姓氏的第一个字母单独列:
<cfquery name="getCustomers">
SELECT C.FirstName, C.LastName, LEFT(C.LastName,1) AS FirstLetter
FROM Customers C
ORDER BY C.LastName
</cfquery>
然后,当您在HTML中输出名称时,可以使用<cfoutput>
的组属性来处理每个字母。
首先制作索引:
<cfoutput query="getCustomers" group="FirstLetter">
<a href="##Letter#FirstLetter#">#FirstLetter#</a> |
</cfoutput>
这将列出像
这样的列表其中每个字母都链接到HTML锚点,显然会跳过丢失的字母,因为查询未选中它们。 (我无法让他们在这篇文章中显示正确的锚点链接,不确定如何)
然后在每个组的开头输出带有锚点的名称列表:
<cfoutput query="getCustomers" group="FirstLetter">
<a name="Letter#FirstLetter#"><hr /></a>
<cfoutput><p>#FirstName# #LastName#</p></cfoutput>
</cfoutput>
所以它看起来像
约翰·亚当斯左·玛丽·亚伦森
杰克·巴伯
凯特·柯林斯
等,其中每个硬标尺都是列表锚
你知道组属性是如何工作的,是吗?如果没有,只需look it up。
(*)以上是“伪CF”,它缺少查询等数据源属性。 我希望它有所帮助。
答案 1 :(得分:-1)
继续尝试;
<cfquery name="RetrieveNames" datasource="#DataSource#">
SELECT FirstName, LastName FROM tblContacts
ORDER BY LastName, FirstName
</cfquery>
<cfset LastFirstLetter="">
<cfoutput query="RetrieveNames">
<cfif Left(LastName,1) is not LastFirstLetter>
<cfset LastFirstLetter = Left(LastName,1)>
<a href="###LastFirstLetter#">#LastFirstLetter#</a>
</cfif>
</cfoutput>
<hr>
<cfset LastFirstLetter="">
<cfoutput query="RetrieveNames">
<cfif Left(LastName,1) is not LastFirstLetter>
<cfset LastFirstLetter = Left(LastName,1)>
<a name="#LastFirstLetter#"></a><b>#LastFirstLetter#</b>
<hr>
</cfif>
#LastName#, #FirstName#<br>
</cfoutput>
我确实想查询这样的查询;
<cfquery name="RetrieveLetters" dbtype="query">
select substr(LastName,1,1) as FirstLetter
from RetrieveNames
group by substr(LastName,1,1)
</cfquery>
但我无法让它发挥作用。但是如果可以,那么你可以在构建href链接时循环使用它,你就不会有它当前拥有的不必要的循环......也许有人可以改进它