【问题标题】:MYSQL RIGHT JOIN filters not workingMYSQL RIGHT JOIN 过滤器不起作用
【发布时间】:2014-12-18 19:46:01
【问题描述】:

如果您可以想象一个评论线程,则此查询用于下拉 cmets 和回复。问题是我需要包含一个右连接来包含 cmets(这些在回复列中有空列值)。问题是它正在拉下所有评论行,正如您从这张图片中看到的那样。为什么我的 pageId、classId、albumId 过滤器无法正确过滤?

SELECT rp.votes, cmts.pageId, cmts.content_element_id, rp.userId as replyUserId, (select users.firstName from users where users.guid = rp.userId) as replyFirstName, 
(select users.lastName from users where users.guid = rp.userId) as replyLastName, rp.originalCommentId as replyOriginalCommentId,
rp.parentCommentId as replyParentCommentId, rp.commentId as replyCommentId, rp.text as replyText, rp.createdAt as replyCreatedAt,
rp.updatedAt as replyUpdatedAt, rp.status as replyStatus, cmts.classId as classId, cmts.albumId as albumId,
cmts.text as OriginalCommentText, cmts.status as CommentStatus, cmts.commentId as commentOriginalId,
cmts.createdAt as CommentCreatedAt, cmts.updatedAt as CommentUpdatedAt, cmts.status as cmtsStatus, cmts.userId as cmtsUserId, (select users.firstName from users where users.guid = cmts.userId) as commentFirstName, (select users.lastName from users where users.guid = cmts.userId) as commentLastName
FROM replies as rp
RIGHT JOIN comments as cmts ON rp.pageId = '36365094-0f52-49e3-bc0e-037edcca574b'
AND cmts.classId = '207'
AND cmts.albumId = '49152e6b-ca80-4889-a65e-4e6fd1dcc367'
AND rp.originalCommentId = cmts.commentId
ORDER BY cmts.createdAt

http://i59.tinypic.com/257q6wg.jpg

我无法进行内部连接,因为它不会返回图片中显示的空值。

@Gordon - 我想我需要一个额外的,就像这样:我现在正在仔细检查它。

RIGHT JOIN comments cmts ON rp.pageId = '36365094-0f52-49e3-bc0e-037edcca574b' 
AND rp.originalCommentId = cmts.commentId
WHERE cmts.classId = '207' AND cmts.albumId = '49152e6b-ca80-4889-a65e-4e6fd1dcc367'  AND cmts.pageId = '36365094-0f52-49e3-bc0e-037edcca574b'
ORDER BY cmts.createdAt

【问题讨论】:

  • 因为它们不是过滤器。 RIGHT JOIN 不会过滤任何记录,只提供匹配或不匹配。如果您希望它们成为过滤器,请使用INNER JOIN

标签: mysql


【解决方案1】:

您正在过滤on 子句中right join 中的第二个表。所以,这没有任何作用。添加where 子句:

where cmts.classId = '207'AND cmts.albumId = '49152e6b-ca80-4889-a65e-4e6fd1dcc367'

进行过滤。

right join 保留第二个表中的所有行,无论 on 子句的计算结果是“true”、“false”还是 NULL。因此,第二个表上的任何过滤器都会被忽略。

(请注意,对于left join,第一个表也是如此。)

编辑:

from 子句会变成:

FROM replies rp RIGHT JOIN
     comments cmts
     ON rp.pageId = '36365094-0f52-49e3-bc0e-037edcca574b' AND
        rp.originalCommentId = cmts.commentId
WHERE cmts.classId = '207' AND
      cmts.albumId = '49152e6b-ca80-4889-a65e-4e6fd1dcc367'

【讨论】:

  • 与之前的 71 相比,这降低了 54,但我需要突出显示的行大约是 4 或 5
  • 见上面的评论。现在测试。
猜你喜欢
  • 1970-01-01
  • 2011-02-21
  • 2018-11-24
  • 2022-12-20
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 2016-12-09
相关资源
最近更新 更多