通过添加一个左连接来更改结果

时间:2012-12-19 15:07:17

标签: mysql

以下是我的两个查询,其中只添加一个左连接结果搞砸了。第二个查询结果是准确的但在第一个查询中通过添加一个左连接输出是不对的(你可以看到我只添加了一个左连接,但我没有在where子句中为该连接添加任何过滤)。请告诉我如何解决这个问题?谢谢,

第一次查询:

SELECT Distinct  count(event_id) as event_count from events 
Left Join events on events.event_id = my_events.i_event_id 
Left Join atdees on events.event_id = atdees.fk_event_id

where my_events.v_title != "NULL" and  r_present = 1 and resident_id = '208'  and event_atd > date_sub(curdate(), interval 37 day) group by event_count  order by event_count desc limit 5

结果:

26  |  12   |  11   |   10

第二次查询:

SELECT Distinct  count(event_id) as event_count from events 
Left Join events on events.event_id = my_events.i_event_id 

where my_events.v_title != "NULL" and  r_present = 1 and resident_id = '208'  and event_atd > date_sub(curdate(), interval 37 day) group by event_count  order by event_count desc limit 5

结果:

2  |  1   |  1   |   1

2 个答案:

答案 0 :(得分:2)

左连接的作用是添加额外(重复)行。

如果您删除count并只列出行,则会看到许多重复的行 这是因为您要求eventsatdees之间的交叉产品;当然还有更多事件和事件的组合,然后只有事件。

真正的基本逻辑。

将您的热门查询更改为

SELECT count(distinct event_id) as event_count from events 
Left Join events on events.event_id = my_events.i_event_id 
Left Join atdees on events.event_id = atdees.fk_event_id

where my_events.v_title != "NULL" and  r_present = 1 and resident_id = '208'
and event_atd > date_sub(curdate(), interval 37 day) 
group by event_count  
order by event_count desc 
limit 5

你应该得到相同的结果(虽然这要慢得多)

进一步注意left join s 不过滤,他们会添加内容 如果您想过滤,请使用inner join s
这是粗略过度简化

关于distinct
distinct关键字可以在聚合函数内部和外部工作。 如果你在里面使用它,它只会计算(总和等)唯一值。 如果在聚合函数之外使用它,它将只列出唯一的行。

即:distinct本身消除了重复的行(它适用于结果集中的所有列)。

函数中的

distinct仅用作该函数的过滤器。

答案 1 :(得分:1)

使用COUNT(DISTINCT),而不是DISTINCT COUNT()

SELECT count(distinct event_id) as event_count from events 

COUNT(DISTINCT)将计算不同值的数量,而不是行数......当您添加额外的LEFT JOIN时,您将增加行数,更改{{{{ 1}}。

另外,您可以仔细检查一下COUNT() ...通过汇总功能进行分组是没有意义的。