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

时间:2016-03-16 18:09:15

标签: php mysql

我在这里遇到问题:

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

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

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'

到目前为止,只有在答案有类似的情况下才会返回,我正在考虑向默认发布答案的用户添加添加内容,但我试图通过解决新问题来提高我的技能的问题。

如果有人建议我如何克服这样一个事实,即如果一张桌子是空的,那么查询仍在继续,我真的很感激。

提前致谢 -

Pihh

1 个答案:

答案 0 :(得分:1)

是。您正在寻找的是left and right joins。根据{{​​3}},LEFT JOIN您仍然可以正常加入两个表,但

  

如果LEFT JOIN中ON或USING部分的右表没有匹配的行,则右表使用所有列设置为NULL的行。

这意味着您可以尝试连接两个表,但如果一行没有任何结果,它仍会返回第一个表的结果。同样适用于RIGHT JOIN只有它的工作方式相反:如果加入的tabled有结果,它将返回结果,但原始表没有。

看起来你有3个关系的3个表:有答案,用户给出答案,答案可能会或可能不会喜欢。要获取此数据,我建议您从answers表开始,在INNER JOIN表上执行users(假设始终有用户),并在您的LEFT JOINlikes表。这是一个简单的例子:

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其他表。我希望这能让您对如何进行查询有所了解。