0

嗨,我目前正在开发一种测验应用程序。在“发现”部分,我得到了热门和最新的问题。但是当我得到它们时,我还应该检查当前用户是否已经回答了问题。

这是我的表格:问题:(media_id 是主键,player_id 是问题的创建者)

media_id - player_id - answer0 - answer1 - ...

答案:(media_id 是主键,player_id 是回答问题的人)

media_id - player_id - result - ...

这就是我得到热门问题的方式:

select * from questions where order by popularity_count

编辑: 让我通过示例展示我想要实现的目标:

问题行:

media_id - player_id - answer0 - answer1
0123456    abc123      bla       bla
6543210    hjk789      lor       ips

回答行:

media_id - player_id - result
6543210    abc123      1

因此,当用户“abc123”得到热门问题时,结果应该是:

media_id - player_id - answer0 - answer1 - is_answered
0123456    abc123      bla       bla       0
6543210    hjk789      lor       ips       1

问题是我需要在查询结果中有一个临时列,指示当前用户是否回答了问题。我怎样才能做到这一点?

我可以通过使用两个查询来查找问题是否已经回答了流行部分。首先,我得到了热门问题,然后我只是检查每个问题是否得到了回答,这似乎是无效的方式。我怎样才能只用一个查询来实现这一点?

谢谢!

4

1 回答 1

0

由于您具有非规范化的表结构,因此您似乎没有正确解决此问题。

您应该有一个单独的表格,其中包含按行的答案。

问题(id、media_id、player_id、问题)

答案(id、media_id、player_id、question_id、答案)

通过这种方式,您可以LEFT JOIN answers轻松questions查看哪些问题没有得到回答,如下所示:

SELECT q.question, a.answer
FROM question q
LEFT JOIN answers a ON a.question_id = q.id
  AND a.media_id = q.media_id
  AND a.player_id = q.player_id

看到它在行动

要将列添加到当前查询,您可以将其附加到您的查询中SELECT并使用CASE语句来检查它是否已被回答。

SELECT ..., 
    CASE
        WHEN answer0 IS NOT NULL
            THEN 'Yes'
        ELSE 'No'
    END AS 'Answered'
FROM ...

更新

根据您的更新,您似乎只JOINplayer_id. 我相信您打算JOIN同时使用player_idmedia_id查看您提供的数据我认为您想要的数据之间的差异。

于 2012-11-28T15:47:40.967 回答