MySQL是否可以生成查询以从多个表中获取,即使一个表没有结果


Is it possible with MySQL to generate a query to fetch from several tables even if one has no results?

我在这里遇到了一个问题:

正在构建一个论坛,这个论坛有几个表格,我正在尝试在单个查询中获取评论和用户信息。

到目前为止,这应该很容易,问题是我无法更改结构,如果答案相似,则通过以下查询,我会得到完美的结果。如果没有人喜欢这个答案,它就会失败。

Select
  mfr.mfr_forum_answers.id,
  mfr.mfr_forum_answers.date_created,
  mfr.mfr_forum_answers.last_updated,
  mfr.mfr_forum_answers.content,
  mfr.mfr_forum_answers.accepted,
  mfr.mfr_forum_answers.user_id,
  mfr.mfr_users.level,
  mfr.mfr_users.avatar,
  mfr.mfr_forum_likes.subject_id,
  mfr.wp_users.ID As ID1,
  mfr.mfr_forum_topics.user_id As owner_id,
  (SELECT count(mfr.mfr_forum_likes.id) FROM mfr.mfr_forum_likes WHERE mfr.mfr_forum_likes.subject_id = :id AND mfr.mfr_forum_likes.type = 'answer') as likes,
  (SELECT count(mfr.mfr_forum_likes.id) FROM mfr.mfr_forum_likes WHERE mfr.mfr_forum_likes.subject_id = :id AND makefitreal.mfr_forum_likes.type = 'answer' AND mfr.mfr_forum_likes.user_id = :sessionId ) as i_like,
 mfr.wp_users.user_nicename
From
  mfr.mfr_forum_likes Inner Join
  mfr.mfr_forum_answers
    On mfr.mfr_forum_answers.topic_id =
    mfr.mfr_forum_likes.subject_id Inner Join
  mfr.mfr_users
    On mfr.mfr_forum_answers.user_id = mfr.mfr_users.id
  Inner Join
  mfr.wp_users
    On mfr.mfr_users.id = mfr.wp_users.ID Inner Join
  mfr.mfr_forum_topics
    On mfr.mfr_forum_answers.topic_id = mfr.mfr_forum_topics.id
Where
     mfr.mfr_forum_answers.topic_id = :id
And
     mfr.mfr_forum_likes.type = 'answer'

到目前为止,它仅在答案有赞时返回,我正在考虑为默认发布答案的用户添加添加,但我正在尝试通过解决新问题来提高我的技能。

如果

有人对我如何克服这样一个事实有建议,即如果表为空,查询将继续,我将不胜感激。

提前致谢-

皮赫

是的。您要查找的内容称为左联接和右联接。根据文档,使用LEFT JOIN您仍然可以正常连接两个表,但

如果左连接中的 ON 或 USING 部分中的右侧表没有匹配的行,则所有列都设置为 NULL 的行将用于右侧表。

这意味着您可以尝试联接两个表,但如果一行没有任何结果,它仍将返回第一个表的结果。对于RIGHT JOIN也是如此,只是它以相反的方式工作:如果要连接到的表有结果,它将返回结果,但原始表没有。

看起来你有 3 个表用于 3 个关系:有答案,用户给出答案,答案可能有也可能没有。为了获取这些数据,我建议从answers表开始,对users表执行INNER JOIN(假设始终有用户),并在likes表上执行LEFT JOIN。下面是一个简单的示例:

SELECT *
FROM answers
INNER JOIN users ON users.id = answers.user_id
LEFT JOIN likes ON likes.answer_id = answer.id
WHERE answers.id = :id
AND likes.type = 'answers'

当然,如果由于某种未知原因您需要从likes表开始,那么您必须RIGHT JOIN其他表。我希望这能让您很好地了解如何进行查询。