我正在创建一个调查,其中员工图片随机显示,登录用户从下拉列表中选择一个名称。我的问题是让每张图片只为每个登录用户显示一次。这是我当前的查询,但我不确定这是否有效
<cfquery name="questions" datasource="STecMySQL">
SELECT DISTINCT PicID
FROM answers
</cfquery>
PS:我正在使用mySql和ColdFusion
答案 0 :(得分:2)
使用原始查询,如果用户有多个图片ID,您将获得用户的重复项。
例如,对于以下查询:
SELECT DISTINCT PicID
FROM answers
根据以下数据,您将获得UserID 1的重复PicID:
PicID UserID
----------------
1 1
3 1
4 2
您确实需要将DISTINCT
应用于用户ID,而不是图片ID。由于您无法使用SELECT
执行此操作,因此可以选择使用GROUP BY
,假设您还有一个UserID字段:
SELECT PicID
FROM answers
GROUP BY UserID
这会对每个用户的结果进行分组,因此您最终只能为每个用户返回一个图片ID。
但是,对于具有多个图片的用户,PicID的值将是任意的。因此,如果您想要明确并且只返回每个用户的最新PicID,您可以使用MAX()
,如下所示:
SELECT MAX(PicID)
FROM answers
GROUP BY UserID
答案 1 :(得分:0)
假设您有1个用户拥有1个图片(而不是1个拥有多个图片的用户)并且您尝试每个用户登录时只显示此用户/图片一次,您可以将PicID查询结果保存到用户会话并删除每个行已显示。所以你可以这样做:
<!--- [ Setup our intial query --->
<cfquery name="questions" datasource="STecMySQL">
SELECT DISTINCT PicID
FROM answers
</cfquery>
<!--- [ Save query to session ] --->
<cfparam name="session.questions" default="questions">
<!--- [ Display Random Image ] ---->
<cfset displayRow=randRange(0, session.questions.recordCount)>
<cfdump var="#session.questions.columnName[displayRow]#">
<!---[ Remove current row - RemoveRows( intRowIndex, intRowCount ) ] --->
<cfset _r = session.questions.RemoveRows(displayRow, 1)>
<!--- [ Setup our intial query --->
<cfquery name="questions" datasource="STecMySQL">
SELECT DISTINCT PicID
FROM answers
</cfquery>
<!--- [ Save query to session ] --->
<cfparam name="session.questions" default="questions">
<!--- [ Display Random Image ] ---->
<cfset displayRow=randRange(0, session.questions.recordCount)>
<cfdump var="#session.questions.columnName[displayRow]#">
<!---[ Remove current row - RemoveRows( intRowIndex, intRowCount ) ] --->
<cfset _r = session.questions.RemoveRows(displayRow, 1)>