我有以下查询:
SELECT DISTINCT
SQL_CALC_FOUND_ROWS
unr.RequestID,
unr.UnRead,
unr.FilterID,
r.GroupID,
r.Year,
rv.Bounty
FROM (users_notify_requests as unr, requests_votes as rv)
JOIN requests AS r ON r.ID = unr.RequestID
WHERE unr.UserID = 1 ORDER BY unr.RequestID DESC LIMIT 50
这应该只返回2行,因为只有两个请求unr.UserID = 1
,但它返回10个版本的第一个版本,5个版本的第二个版本完全相同(分别)。知道为什么会这样吗?
编辑:MySQL版本5.5.29,根据要求。
编辑2:print_r()
转储:http://pastebin.com/BXujnEpx。结果对于给定的ID具有不正确的赏金,因此查询的内容非常明显。
答案 0 :(得分:2)
您没有使用任何条件加入rv,因此该表中的每一行都将被返回:这可能是您额外行的原因。
您可能需要以下一行(猜测列名称,因为我没有您的架构):
INNER JOIN request_votes rv ON rv.requestId = r.id
答案 1 :(得分:0)
您正在加入两张基于笛卡尔积或交叉连接的表格。
FROM (users_notify_requests as unr, requests_votes as rv)
然后你正在使用内连接。
JOIN requests AS r ON r.ID = unr.RequestID
要解决此问题,您应该在两种情况下使用内部联接。
笛卡尔连接是指将一个表的每一行连接到另一个表的每一行。如果第一个表包含第二个中的x行和y行,则结果集将为x * y rows。
SELECT DISTINCT
SQL_CALC_FOUND_ROWS
unr.RequestID,
unr.UnRead,
unr.FilterID,
r.GroupID,
r.Year,
rv.Bounty
FROM users_notify_requests as unr
JOIN requests_votes as rv ON rv.RequestID = unr.RequestID
JOIN requests AS r ON r.ID = unr.RequestID
WHERE unr.UserID = 1 ORDER BY unr.RequestID DESC LIMIT 50