我需要在项目的多个表之间创建有效的联接查询的问题。问题是我在运行查询时得到重复的值。如果需要sql dump,我愿意这样做
在这里 表1 :-(用户) user.user_id表是主表,在不同表中出现多次,而user.uname是主表,在不同表中出现多次(这不是像user_id这样的已定义主键) 1)updates.user_id_u是user.user_id的次要角色,可以多次发生 2)updates.account_name和updates.author仅次于user.uname,并且可以多次出现 3)group_posts.author_id仅次于user.user_id,并且可能发生多次 4)group_posts.author_gp是user.uname的次要角色,并且可以根据不同的用户出现多次。 5)user.user_id是voted_u.user_id_v(包含用于更新的喜欢和不喜欢的列的表)的主要元素,并且可以多次出现 6)voted_g_c.user_id_reply_g仅次于user.user_id,并且由于用户单击页面中的不同链接而发生多次。 7)voted_c.user_id_reply在user.user_id之后,并且可能发生多次,因为用户可能单击页面中的许多链接以获取更新表注释。
表2 :-( group_posts) group_posts.gp_id是主要的,而group_posts.pid也是组帖子注释的主要类型(这意味着对gp_id的注释并且可以多次出现) 1)group_posts.gname是groups.name的第二个,并且可以多次出现,因为它是组的名称。 2)voted_g_u.vote_4_gid(group_posts用户喜欢或不喜欢按钮单击的表)仅次于group_posts.g_id,并且可能会发生多次,因为用户可能会单击相同或不喜欢的按钮 3)group_posts.group_id是groups.g_id的附属元素,并且可能出现多次,因为许多用户可能在同一组中发帖。 4)group_posts.author_id在user.user_id之后,并且可以多次出现。
表3 :-(组) groups.g_id是主要的,仅出现一次,groups.name也是如此。 1)groups.creator仅次于user.uname,并且由于用户可能创建多个组,因此可以多次出现。
表4 :-(评论更新) comment_update.comment_id是主要的,仅发生一次。 1)comment_update.os_id(原始状态ID)仅次于update.update_id,并且可能会发生多次,因为用户可能会对同一更新发表评论。 2)comment_update.author_c与u.uname相关,并且可以多次出现 3)comment_update.user_id_c与user.user_id相关,并且可以多次出现
表4 :-(我想做的gmembers或group成员是我要获取同一组的用户并获取他们的group_updates) 1)gmembers.gname实际上是组名,是groups.name的第二名,可以多次出现 2)gmembers.mname是用户名或与user.uname相关,并且可以多次出现 3)gmembers.group_id是groups.g_id的附属元素,可以多次出现 4)gmembers.user_id_group在user.user_id之后,并且可以多次出现,因为可能是许多组的成员
表5 :-( voted_u和voted_c) 1)voted_u.vote_4_update_id是updates.update_id的次要元素,并且可能发生多次 2)voted_u.user_id_v是user.user_id的次要角色,并且对于同一voted_u.vote_4_update_id可以多次出现 3)voted_c.vote_4_reply_id在comment_update.comment_id之后,是次要的,并且可能发生多次 4)voted_c.user_id_reply仅次于user.user_id,并且可能发生多次 表6 :-( voted_g_u和voted_g_c) 像voted_u和votedd_c这样的voted_g_u和voted_g_c的主键都不会具有辅助值 1)voted_g_u.vote_4_gid仅次于group_posts.gp_id,并且可以发生多次。
查询:-
SELECT DISTINCT up.*
, g.*
, cu.*
, gm.*
, gp.*
, v_g.*
, v_g_c.*
, v_u.*
, v_c.*
, u.uname
, u.avatar
, u.user_id
FROM group_posts as g
JOIN user u
ON u.user_id = g.author_id
LEFT
JOIN updates up
ON up.user_id_u = u.user_id
LEFT
JOIN groups gp
ON g.group_id = gp.g_id
LEFT
JOIN gmembers gm
ON gm.user_id_group = g.author_id
LEFT
JOIN comment_update cu
ON cu.os_id = up.update_id
LEFT
JOIN voted_g_u v_g
ON v_g.vote_4_gid = g.gp_id
LEFT
JOIN voted_g_c v_g_c
ON v_g_c.vote_4_reply_id = g.pid
LEFT
JOIN voted_u v_u
ON v_u.vote_4_update_id = up.update_id
LEFT
JOIN voted_c v_c
ON v_c.vote_4_reply_id = cu.comment_id
WHERE g.group_id = 25
AND u.user_id = 127
GROUP
BY up.update_id
, g.gp_id
ORDER
BY u.user_id desc
如果您想最好地了解一对多关系,我会为您提供sql dump,并且欢迎您提出疑问。
编辑:- 我了解我很环保,需要学习很多知识,但是我正在寻找一种快速解决方案来完成该项目,因为学习如何进行查询需要一些时间。 这是SQL转储: http://rextester.com/KRWG51655