台灣最大程式設計社群網站
線上人數
1624
 
會員總數:246203
討論主題:189775
歡迎您免費加入會員
討論區列表 >> ASP >> 會員投票票數計算問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
會員投票票數計算問題
價值 : 10 QP  點閱數:1338 回應數:9
樓主

tiger
門外漢
0 14
480 53
發送站內信

各位大大
小弟想在公司設計人事線上投票系統,每個會員都可以多重投票,我將每個會員投票結果(checkbox)放入資料表中的一個欄位,
如何將所有的投票結果統計出個人得票數,這個問題一直困惱我,請大大幫我提供建議吧。謝謝

搜尋相關Tags的文章: [ 會員投票 ] ,
本篇文章發表於2014-04-15 20:44
1樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
這個可以算是SQL設計不良吧,至少我是不會這樣來記錄
這種儲存方式要看你資料內容是什麼

第一種,用逗號或分號將會員(或投票項目)ID串成字串,這算是最常見的存法,因為夠直覺,但是使用上會很麻煩
我個人技術不足,面對這樣的情況只能把所有可能資料撈出來,然後再用ASP去判斷
例如要撈會員ID是5的會員得票數,就用
`投票結果欄位` LIKE '%5%'(要注意,如果是搭配Access,在ASP中要用這個寫法,但是在Access上測試的話,百分比符號要改成星號)
這樣撈出的資料除了會員ID是5的會員外,還會撈出所有ID中包含5的會員,例如15、25、51、105、153、522之類的
接下來就得用ASP去檢查然後做累計動作

第二種,用逗號或分號將會員姓名(或投票項目)串成字串,基本上不推薦這種做法,中文字在處理上往往會有很多麻煩的地方
但是如果沒有重名(包含部分重名,例如金田一和金田一一就是部分重名),用上面的做法就能直接撈出所有資料
SELECT COUNT(*) FROM `會員表單` WHERE `投票結果欄位` LIKE '%金田一%'
直接取得個人得票數,當然如果有重名或部分重名的狀況就得和上面一樣用ASP去做檢查

第三種,用特殊符號前後包住項目內容再用另一種符號分隔串成字串,這是比較推薦的做法
以ID為例,串成的字串會像這樣
@1@,@5@,@7@,@15@,@23@
如此以來想要統計ID為5的會員得票數就用
SELECT COUNT(*) FROM `會員表單` WHERE `投票結果欄位` LIKE '%@5@%'
直接取得得票數,不用擔心會有抓到15、51、151之類的問題
而且因為依然有用分隔符號,所以還是可以字串轉陣列,只要再用字串取代,用""取代掉@就可以取得正確的陣列值
本篇文章回覆於2014-04-16 09:30
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

tiger
檢舉此回應
謝謝大大解說,可是我的會員有200多個,每個人都可以投五票,如何計算每個人的投票數呀
SELECT COUNT(*) FROM `會員表單` WHERE `投票結果欄位` LIKE '%@5@%'
光是這行就要寫200多次了。
本篇文章回覆於2014-04-16 11:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
這問題基本到讓我震驚了...
請先用
SELECT `ID` FROM `會員表單`
將結果用迴圈從頭跑一次
把投票數的查詢放在迴圈中,這樣你只需要寫一次就行了
本篇文章回覆於2014-04-16 17:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

tiger
檢舉此回應
哈哈 我當然知道用迴圈 但是電腦要跑200多次 這樣效能會不會很差呀
我想到一個方法 將所有的投票結果 都放到陣列中 計算陣列中人名出現次數

郭靜, 張正三, 資優生, 林輸好, 王家家, 張正三, 資優生, 林輸好, 張曉明,張正一, 張正三, 林輸好, 王家家,張正三, 林輸好, 張曉明,資優生, 林輸好, 王家家,郭靜, 林輸好, 張曉明, 業品源,郭靜, 張正三, 王家家,張正三, 資優生, 王家家,

例如上述
但從陣列統計個人得票數我就不會寫了,各位大大可以幫忙嗎?
本篇文章回覆於2014-04-17 07:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
不會啊
假設會員有200個,平均投票數為3
用我的方法總共是200次

如果先存到陣列,這個動作就用迴圈跑200次
然後陣列逐個檢查計次,用迴圈要跑600次
最後你要展示的話又是200次
要跑800到1000次喔

雖然你的資料庫連線動作只有1次
但是效能上會比較差
同樣是計次功能,用資料庫跑花的效能通常會比用程式跑優秀
不然的話,SQL的運算函數就失去意義了

如果資料表用更合理的方式設計,可以直接用一個查詢式跑出所有結果,這當然才是最好的
但是如果不良資料表設計已經是定局了,那就只好退而求其次了
本篇文章回覆於2014-04-17 10:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

tiger
檢舉此回應
恩下午試看看 謝謝
本篇文章回覆於2014-04-17 11:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

tiger
檢舉此回應
謝謝大大
已經成功了,果然比較快
但sql的最大值(已就是得票者)要如何表示呀? 或者前5名也要列出來
有sql語法嗎 或者要怎麼做呀
本篇文章回覆於2014-04-17 15:00
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
按照你的資料表設計,這邊只能在程式中去記錄和比較
畢竟會用迴圈去處理,就是因為沒辦法用SQL一次抓出全部
既然無法一次抓出全部的,就更提不上排序了
本篇文章回覆於2014-04-17 17:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

MIS2000 Lab
檢舉此回應


為何要這樣設計?

當資料表設計爛了,你事後就得寫很多程式去解
(你下一個問題就是由於你的Table搞成的)

如果你想做「投票區」
可以參考我這本書http://24h.pchome.com.tw/books/prod/DJAA2V-A78626445

這些範例,我以前在ASP就做出來了
現在只是改寫成ASP.NET版

但設計觀念沒變,程式碼也大同小異

第11章 線上問卷、全自動化投票區、動態問卷產生器、長條圖與Chart控制項
我做了三種投票區,比較不同的差異與優缺點

最後才能作出自己想要的

您可以參考一下
本篇文章回覆於2014-04-18 17:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.