4

我的网络应用程序处理民意调查(调查)。现在我有 2 个表作为数据库模式的一部分。

polls
    id
    question
    choices (ex: yes,no,maybe)
    created

polls_responses
    poll_id
    user_id
    tracker_id
    response

问题在于,在一些民意调查中,我有很多回复(> 1000)。人们可以查看投票结果,它将显示有多少用户投票赞成、反对或可能,以及有多少匿名用户投票赞成、反对或可能。这样做的问题是,每当用户查看投票结果时,它必须遍历所有响应并计算响应的总数、每个选择的响应数、用户做出的每个选择的响应数,以及#tracker_id(匿名用户)做出的每个选择的响应并计算百分比并将其显示在条形图中。这使得页面加载非常缓慢。我正在考虑对数据库进行非规范化以提高性能,这样我们就有了这样的东西

polls
    id
    question
    choices (ex: yes,no,maybe)
    total_responses (ex: 10,3,3,4)
    user_responses (ex: 5,2,2,1)
    anon_responses (ex: 5,1,3,1)
    created

polls_responses
    poll_id
    user_id
    tracker_id
    response

也就是说,对于 中的值total_responses,10 是总数,3 是选择的响应数yes,3 是选择的响应数no,4 是选择的响应数maybe。相同的格式适用于user_responsesanon_responses字段。如果我能就这种方法得到一些意见,将不胜感激!谢谢你的时间。

编辑:我正在使用 MySQL

4

2 回答 2

3

首先,我认为你不需要循环来计算这个。

看看这样的东西

SELECT  poll_id,
        COUNT(response) Total,
        SUM(CASE WHEN response = 'Y' THEN 1 ELSE 0 END) TotalYes,
        SUM(CASE WHEN response = 'N' THEN 1 ELSE 0 END) TotalNo,
        SUM(CASE WHEN response = 'M' THEN 1 ELSE 0 END) TotalMaybe,
        SUM(CASE WHEN [user_id] IS NOT NULL AND response = 'Y' THEN 1 ELSE 0 END) UserYes,
        SUM(CASE WHEN [user_id] IS NOT NULL AND response = 'N' THEN 1 ELSE 0 END) UserNo,
        SUM(CASE WHEN [user_id] IS NOT NULL AND response = 'M' THEN 1 ELSE 0 END) UserMaybe,
        SUM(CASE WHEN tracker_id IS NOT NULL AND response = 'Y' THEN 1 ELSE 0 END) TrackerYes,
        SUM(CASE WHEN tracker_id IS NOT NULL AND response = 'N' THEN 1 ELSE 0 END) TrackerNo,
        SUM(CASE WHEN tracker_id IS NOT NULL AND response = 'M' THEN 1 ELSE 0 END) TrackerMaybe
FROM    polls_responses
GROUP BY poll_id

这应该会为您提供每个 poll_id 的相应结果,然后您可以从那里重新连接到表以检索投票详细信息。

于 2010-02-19T06:58:09.410 回答
0

不要害怕使用数据库为您完成一些繁重的工作。您不必遍历输出中的所有响应。

您尚未指定您的数据库平台,但您可能可以使用一些连接和聚合函数或一些子选择在数据库中处理这个问题。

于 2010-02-19T06:56:50.027 回答