多表查询报表开发:应使用Right Join还是其他连接类型?
连接类型选择与查询实现方案
首先,咱们先明确你的核心需求:要展示所有站点(不管某个用户类型有没有点击量)的对应数据,同时还要关联noanswer表。这种场景下,LEFT JOIN是更合适的选择,而不是RIGHT JOIN——原因很简单:RIGHT JOIN会以右侧表的记录为基准,容易丢失那些没有点击量的站点;而LEFT JOIN能保证主表(你的站点列表)的所有记录都被保留,其他表匹配上的就显示数据,没匹配上的用NULL(或者你可以转成0)填充。
下面给你分步拆解实现思路和SQL示例:
1. 先理清表关系假设
先假设你的表名和字段是这样的(如果实际名称不同,替换成你自己的就行):
sites:仅存所有站点名称,字段为sitenames(这是你的核心主表)usertype1_hits:存用户类型1的点击量,字段sitenames(关联站点)、hits(点击量)usertype2_hits:用户类型2的点击量表,结构同上usertype3_hits:用户类型3的点击量表,结构同上noanswer:需要关联的表,假设也是通过sitenames字段和站点表关联(比如用来筛选特定站点,或补充站点信息)
2. 分情况的JOIN写法
情况一:只需要noanswer表中存在的站点
如果你的报表只需要展示noanswer表里有的站点,那先把sites和noanswer做INNER JOIN筛选出目标站点,再用LEFT JOIN关联三个点击量表:
SELECT s.sitenames AS Site, -- 用COALESCE把NULL转成0,避免报表出现空值 COALESCE(u1.hits, 0) AS Userype1hits, COALESCE(u2.hits, 0) AS Userype2hits, COALESCE(u3.hits, 0) AS Userype3hits FROM sites s -- 只保留noanswer中存在的站点 INNER JOIN noanswer na ON s.sitenames = na.sitenames -- LEFT JOIN确保即使站点没有对应用户类型的点击量,也能保留该站点记录 LEFT JOIN usertype1_hits u1 ON s.sitenames = u1.sitenames LEFT JOIN usertype2_hits u2 ON s.sitenames = u2.sitenames LEFT JOIN usertype3_hits u3 ON s.sitenames = u3.sitenames ORDER BY s.sitenames;
情况二:保留所有站点,同时关联noanswer表的信息
如果要展示所有站点,不管noanswer里有没有,只是需要关联noanswer的相关数据(如果有的话),那把sites和noanswer做LEFT JOIN即可:
SELECT s.sitenames AS Site, COALESCE(u1.hits, 0) AS Userype1hits, COALESCE(u2.hits, 0) AS Userype2hits, COALESCE(u3.hits, 0) AS Userype3hits, -- 如果noanswer有其他字段,也可以在这里添加 na.some_field AS NoAnswerInfo FROM sites s -- 保留所有站点,关联noanswer的信息(没有则显示NULL) LEFT JOIN noanswer na ON s.sitenames = na.sitenames LEFT JOIN usertype1_hits u1 ON s.sitenames = u1.sitenames LEFT JOIN usertype2_hits u2 ON s.sitenames = u2.sitenames LEFT JOIN usertype3_hits u3 ON s.sitenames = u3.sitenames ORDER BY s.sitenames;
3. 为什么不选RIGHT JOIN?
举个例子:如果用RIGHT JOIN把sites和usertype1_hits关联,那结果只会保留有用户类型1点击量的站点——那些没被点击过的站点就会被过滤掉,这显然不符合你要展示所有站点的需求。所以RIGHT JOIN在这里不适用。
内容的提问来源于stack exchange,提问作者Gatewarden
相关产品推荐
相关产品推荐

