我在这里遇到问题:
我正在建立一个论坛,这个论坛有几个表格,我试图在一个查询中获取评论和用户信息。
到目前为止,它应该很容易,问题是我无法改变结构,并且通过以下查询,我得到了一个完美的结果,如果有一个类似的答案。如果没有人喜欢这个答案就会失败。
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
答案 0 :(得分:1)
是。您正在寻找的是left and right joins。根据{{3}},LEFT JOIN
您仍然可以正常加入两个表,但
如果LEFT JOIN中ON或USING部分的右表没有匹配的行,则右表使用所有列设置为NULL的行。
这意味着您可以尝试连接两个表,但如果一行没有任何结果,它仍会返回第一个表的结果。同样适用于RIGHT JOIN
只有它的工作方式相反:如果加入的tabled有结果,它将返回结果,但原始表没有。
看起来你有3个关系的3个表:有答案,用户给出答案,答案可能会或可能不会喜欢。要获取此数据,我建议您从answers
表开始,在INNER JOIN
表上执行users
(假设始终有用户),并在您的LEFT JOIN
上likes
表。这是一个简单的例子:
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
其他表。我希望这能让您对如何进行查询有所了解。