MySQL表自联接返回太多行

时间:2013-02-22 15:37:39

标签: mysql sql join

所以我有一张表my_table,其中包含主键idINT),以及更多列fooVARCHAR)和{{ 1}}(bar)。每个DOUBLE应该在我的表格中显示一次,并带有相关的foo值,但我知道我有几行,其中bar个相同的foobar。如何获取包含相同foo值但具有不同bar s(例如,差异超过10)的那些行的列表? 我试过了:

    SELECT t1.id, t1.bar, t2.id, t2.bar, t1.foo
    FROM my_table t1, my_table t2
    WHERE t1.foo=t2.foo
    AND t1.bar - t2.bar > 10.; 

但是我得到了很多很多结果(超过my_table中的总行数)。我觉得我必须做一些非常明显的蠢事,但看不出我的错误。

啊 - 谢谢SWeko:我想我理解为什么我会得到这么多结果呢。在SQL中,对于每个foo,是否有一种方法可以计算foobar的差异超过10的行数。?

3 个答案:

答案 0 :(得分:2)

回答您的最新问题:

  

对于每个foo,在SQL中是否有计算行数的方法   那个foo但是酒吧差异超过10个。?

这样的查询应该有效:

select t1.id, t1.foo, t1.bar, count(t2.id) as dupes
from my_table t1
  left outer join my_table t2 on t1.foo=t2.foo and (t1.bar - t2.bar) > 10
group by t1.id, t1.foo, t1.bar; 

答案 1 :(得分:0)

例如,如果您有5行foo='A'和10行foo='B',则自联接将每个A行彼此连接A行(包括其自身)和每个B -row与对方B-row,所以简单

SELECT t1.id, t1.bar, t2.id, t2.bar, t1.foo
FROM my_table t1, my_table t2
WHERE t1.foo=t2.foo

将返回5*5+10*10=125行。过滤这些值会减少该数字,但您可能仍然拥有(显着)多于您开始的行数。例如。如果我们假设B行的值bar分别为5到50,那就意味着它们将匹配:

bar = 5  - 0 rows that have bar less than -5
bar = 10 - 0 rows that have bar less than 0
bar = 15 - 0 rows that have bar less than 5
bar = 20 - 1 rows that have bar less than 10
bar = 25 - 2 rows that have bar less than 15
bar = 30 - 3 rows that have bar less than 20
bar = 35 - 4 rows that have bar less than 25
bar = 40 - 5 rows that have bar less than 30
bar = 45 - 6 rows that have bar less than 35
bar = 50 - 7 rows that have bar less than 40

因此,对于B行,您将获得28个结果,并且该数字会随着具有相同值foo的行的平方而上升。

答案 2 :(得分:-1)

您是否尝试使用“新”JOIN语法进行同样的操作?

    SELECT t1.*,
           t2.*
      FROM my_table t1
      JOIN my_table t2 ON t1.foo = t2.foo
     WHERE (t1.bar - t2.bar) > 10

我不怀疑这会解决你的问题,但对我而言,这至少是我要开始的地方。

我也可以试试这个:

    SELECT t1.*,
           t2.*
      FROM my_table t1
      JOIN my_table t2 ON t1.foo = t2.foo AND t1.id != t2.id
     WHERE (t1.bar - t2.bar) > 10