您好我正在开发一种测验应用程序。在“发现”部分,我会得到热门和最新的问题。但是当我得到它们时,我还应该检查当前用户是否已经回答了问题。
这是我的表格: 问题:(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
问题是我在查询结果中需要一个临时列,指示当前用户是否回复了问题。我怎样才能做到这一点?
我可以通过使用两个查询找到问题是否已经回答了流行度部分。首先,我得到了流行的问题,然后我只是检查问题是否得到回答,因为每个问题看起来都是无效的。如何只用一个查询来实现这个目标?
谢谢!
答案 0 :(得分:0)
由于您具有非规范化的表结构,似乎您没有正确接近此问题。
您应该有一个单独的表,其中包含按行排列的答案。
问题(id,media_id,player_id,问题)
回答(id,media_id,player_id,question_id,answer)
这样您就可以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 ...
<强>更新强>
根据您的更新,您似乎只JOIN
player_id
。我相信您打算JOIN
和player_id
media_id
。查看data you provided和what I think you intend it to be之间的差异。