为什么这个SQL查询在数据库中没有重复时返回重复记录?

时间:2011-02-14 17:16:05

标签: sql mysql

SELECT *
FROM support_systems,tickets
INNER JOIN user_access ON tickets.support_system_id = user_access.support_system_id
WHERE support_systems.account_id = #session.account_id# 
AND user_access.user_access_level >= 1 
AND user_access.user_id = #session.user_id# 

为什么这个查询会返回带有重复记录的记录集的任何线索?结果如下:

Priority    ID      Subject         Status
high        1       First Subject   open
high        1       First Subject   open
low         3       Weeee           open
low         3       Weeee           open
medium      4       hhhhh           closed
medium      4       hhhhh           closed
medium      5       neat            open
medium      5       neat            open

如果你们需要更多信息,请告诉我,非常感谢。

3 个答案:

答案 0 :(得分:4)

您正在从表support_system中选择记录,但尚未指定连接条件。这个表和你正在审问的其他人之间有什么关系?

你可能想要这样的东西

SELECT *
FROM support_systems 
INNER JOIN tickets ON 
support_systems.support_system_id = tickets.support_system_id
INNER JOIN user_access ON 
tickets.support_system_id = user_access.support_system_id

WHERE support_systems.account_id = #session.account_id# 
AND user_access.user_access_level >= 1 
AND user_access.user_id = #session.user_id# 

答案 1 :(得分:2)

问题在于这一行:

FROM support_systems,门票

我会从FROM子句中删除票证并使其成为内部连接子句。现在你有了所谓的“跨产品”:http://en.wikipedia.org/wiki/Cross_product

答案 2 :(得分:1)

我不得不说,这可能是因为你有一个明确的连接和一个非明确的连接,这个连接在生产笛卡尔的地方没有处理......

你有三张桌子......

但只有两个表在连接中使用...你需要第二个连接...你需要在你的连接中包含support_systems。

可能喜欢

from support_systems a left join user_access b on a.support_systems_id = b.support_systems_id
left join ticket c on c.support_systems_id = b.support_systems_id

然后你的位置将是相同的...它将根据正确连接的表返回。