MySQL连接查询,无法理解

MySQL连接查询,无法理解,mysql,Mysql,我有两个表格:问题和问题查找。用户投票,如果这是一个好问题或不放在网站上 table: questions id question date_created table: questions_lookup id question_id // (id linked to questions table) user_id // (the id of the user, I store this in a session variable called

我有两个表格:问题和问题查找。用户投票,如果这是一个好问题或不放在网站上

table: questions
    id
    question
    date_created
table: questions_lookup
    id
    question_id // (id linked to questions table)
    user_id // (the id of the user, I store this in a session variable called $me)
    show // (1 or 0, show or don't show)
我想有一个php页面,从问题表中提取所有问题,按创建日期排序,然后显示用户是否回答了问题。当我尝试进行任何连接时,我最终会显示重复的问题,因为它会获取其他用户的答案

如果有10个问题。某个用户只回答了3个问题。我们仍然显示所有10个问题,但标记他们已回答的问题

因此,我基本上希望显示如下内容:

Question 1
Question 2 (answered)
Question 3 (answered)
Question 4
Question 5
Question 6
Question 7 (answered)
Question 8
Question 9
Question 10 
我试过:

从问题中选择* 右连接问题\u查找 关于questions.id=questions\u lookup.question\u id 其中问题_lookup.user_id='$me' 按问题排序。创建日期\u描述
类似这样,假设在问题查找中每个用户每个问题只能有一条记录

诀窍是查询所有问题并左键加入问题查找。通过将用户id添加到加入条件中,您将省去其他用户的记录,同时仍然返回没有当前用户记录的问题。如果将ql.user_id=5移动到where子句,查询将不再工作,因为它将有效地将左连接转换为内部连接

[编辑]


我看你已经添加了你的查询。有两个错误。右连接应该是左连接,因为您总是希望在左侧问题上有记录,在右侧查找上有可选记录。此外,条件不应出现在where子句中。

类似的情况,假设在问题查找中每个用户每个问题只能有一条记录

诀窍是查询所有问题并左键加入问题查找。通过将用户id添加到加入条件中,您将省去其他用户的记录,同时仍然返回没有当前用户记录的问题。如果将ql.user_id=5移动到where子句,查询将不再工作,因为它将有效地将左连接转换为内部连接

[编辑]

我看你已经添加了你的查询。有两个错误。右连接应该是左连接,因为您总是希望在左侧问题上有记录,在右侧查找上有可选记录。此外,条件不应出现在where子句中。

如何:

SELECT questions.*, max(questions_lookup.show) AS show 
FROM questions 
LEFT JOIN questions_lookup ON questions_lookup.question_id=questions.id 
WHERE (questions_lookup.user_id='youruserid' OR questions_lookup.user_id IS NULL) 
GROUP BY questions.id 
ORDER BY questions.date_created ASC
然后在结果中,show=1表示用户已回答。

如何:

SELECT questions.*, max(questions_lookup.show) AS show 
FROM questions 
LEFT JOIN questions_lookup ON questions_lookup.question_id=questions.id 
WHERE (questions_lookup.user_id='youruserid' OR questions_lookup.user_id IS NULL) 
GROUP BY questions.id 
ORDER BY questions.date_created ASC
然后在结果中,show=1表示用户已回答。

SELECT q.*, l、 用户id, l、 展示, 如果问题id为空,则回答为“已回答” 从问题q左连接 q.id=l.question\u id和 l、 用户id=5选择q*, l、 用户id, l、 展示, 如果问题id为空,则回答为“已回答” 从问题q左连接 q.id=l.question\u id和
l、 用户\u id=5您可以发布您的SQL查询来检索10Q列表吗?我刚刚用我尝试的查询更新了它。显示字段的用途是什么?显示字段是用户投票决定是否在站点上显示问题。因此,他们可以投票赞成1该问题应该出现在网站上,或者投票反对0。您可以发布SQL查询来检索10个问题列表吗?我刚刚用我尝试的查询更新了它。显示字段的目的是什么?显示字段是指用户投票决定是否在网站上显示该问题。因此,他们可以投票赞成1,该问题应该出现在网站上,或者投票反对0。这一个没有显示所有问题。它缺少用户未回答的问题,不在问题查找表中。此问题未显示所有问题。它缺少用户没有回答的问题,而不是在问题查找表中。我认为这一个有效!我还要再测试一下。谢谢我想这一个有用!我还要再测试一下。谢谢
IF(l.question_id IS NULL,'','answered') as answered <-- 'answered' if answered, empty string if not (like in your example)
IFNULL(l.question_id,0) as answered <-- question_id (if autogenerated unsigned  int will be > 0) if answered, 0-if not
CASE WHEN ql.question_id IS NULL THEN 'no' ELSE 'yes' END as answered <-- yes if answered and no if not