使用MySQL加入的问题

时间:2011-05-09 15:31:12

标签: mysql

我有一个MySQL SELECT查询,它使用Mysql JOIN从6个表中获取数据。这是我正在使用的MySQL查询。

SELECT
u.id,u.password,
u.registerDate,
u.lastVisitDate,
u.lastVisitIp,
u.activationString,
u.active,
u.block,
u.gender,
u.contact_id,
c.name,
c.email,
c.pPhone,
c.sPhone,
c.area_id,
a.name as areaName, 
a.city_id, 
ct.name as cityName, 
ct.state_id,
s.name as stateName,
s.country_id,
cn.name as countryName
FROM users u
LEFT JOIN contacts c ON (u.contact_id = c.id)
LEFT JOIN areas a ON (c.area_id = a.id)
LEFT JOIN cities ct ON (a.city_id = ct.id)
LEFT JOIN states s ON (ct.state_id = s.id)
LEFT JOIN countries cn ON (s.country_id = c.id)

虽然查询工作得非常好,但如果在使用LEFT JOIN时发现任何重复值,有时会返回重复的结果。例如,在联系人表中,存在两个区域为“2”的行,这导致返回另一个重复的行。如何进行查询以仅选择所需的结果而不重复任何行。是否有任何不同类型的MySQL加入我应该使用?

谢谢

更新:

这里是联系人表,列area_id可能有几个重复的值。

enter image description here

答案:

我的状态在上次LEFT JOIN中出现错误,我使用了(s.country_id = c.id)而不是在分割查询后应该是(s.country_id = cn.id)并且单独测试我必须跟踪错误。感谢您的答复。它现在完美无缺。

2 个答案:

答案 0 :(得分:1)

我认为DISTINCT可能正是您所寻找的:

SELECT DISTINCT
u.id,u.password,
u.registerDate,
u.lastVisitDate,
u.lastVisitIp,
u.activationString,
u.active,
u.block,
u.gender,
u.contact_id,
c.name,
c.email,
c.pPhone,
c.sPhone,
c.area_id,
a.name as areaName, 
a.city_id, 
ct.name as cityName, 
ct.state_id,
s.name as stateName,
s.country_id,
cn.name as countryName
FROM users u
LEFT JOIN contacts c ON (u.contact_id = c.id)
LEFT JOIN areas a ON (c.area_id = a.id)
LEFT JOIN cities ct ON (a.city_id = ct.id)
LEFT JOIN states s ON (ct.state_id = s.id)
LEFT JOIN countries cn ON (s.country_id = c.id)

这应该只返回用户ID不同的行,尽管您可能无法获得所希望的所有已连接数据。

答案 1 :(得分:1)

像你提到的那样复制行似乎表明存在数据问题。

如果users是您最精细的表,则不应发生这种情况 那么,我猜,单个用户可能在contacts中有多个条目

可以使用@dxprog提到的DISTINCT,但我认为GROUP BY更合适。 GROUP BY无论哪个数据点都可能被复制.... 毕竟,如果用户有相应的联系人记录,您打算将JOIN指向哪个?

如果要删除“重复”,则必须指定此项,因为就RDBMS而言,匹配的两行

 LEFT JOIN contacts c ON (u.contact_id = c.id)

事实上,已经是不同的