我有一个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可能有几个重复的值。
答案:
我的状态在上次LEFT JOIN中出现错误,我使用了(s.country_id = c.id)
而不是在分割查询后应该是(s.country_id = cn.id)
并且单独测试我必须跟踪错误。感谢您的答复。它现在完美无缺。
答案 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)
事实上,已经是不同的