【问题标题】:How to join same table to check if a>b with 10如何加入同一张表以检查 a>b 是否为 10
【发布时间】:2015-03-28 09:38:38
【问题描述】:

mytable

id      numbers       whereonly

1       2                1
2       35               1
3       22               1
4       20               1
5       3                1
6       70               1
7       80.15925         1
8       60               7
9       50               7

我需要按 numbers 排序并以 id 1 进行搜索,直到找到一个 id 的 numbers 行大于 10。
所需结果:2、20、35、70、80.15925
仅当列 whereonly 为 1 时
有没有办法做到这一点?

【问题讨论】:

  • 2、20、35、70、80.15925
  • 我认为数据集不能恰当地代表问题。例如,这个答案产生了正确的结果,但我不能肯定地说它是正确的:sqlfiddle.com/#!9/aa080/9
  • 是的,但是当我申请 whereonly=1 时不起作用
  • “不工作”在 SO 中是不可接受的表达方式

标签: mysql join compare


【解决方案1】:

你可以试试这个:

SELECT DISTINCT t1.id AS id, t1.numbers AS numbers
FROM table AS t1
INNER JOIN table AS t2 ON t1.numbers > t2.numbers - 10
WHERE t1.whereonly = 1
GROUP BY t2.numbers
ORDER BY t1.numbers;

这里是sqlfiddle

编辑 1:如strawberry 建议的那样

SELECT DISTINCT x.* 
  FROM mytable x
  JOIN
     ( SELECT t2.numbers t2n
            , MIN(t1.id) id
         FROM mytable t1
         JOIN mytable t2 
           ON t1.numbers > t2.numbers - 10
        GROUP 
           BY t2.numbers
     ) y
    ON y.id = x.id
    ORDER BY x.numbers
    WHERE x.whereonly = 1;

这里是sqlfiddle

【讨论】:

  • 如果您发现在同一个查询中有 DISTINCT 和 GROUP BY,那么可能是出了点问题。同样,如果您发现自己有一个 GROUP BY 子句但没有聚合函数,那么同样,有些事情(几乎)肯定是不正确的。
  • @Strawberry 不错的提示。但这也会产生正确的结果。
  • 如何添加ORDER BY numbers ASC?
  • SELECT 2 个数字 UNION SELECT 20 等也是如此。这证明什么都没有。
  • 也就是说,我相信您可以按如下方式重写您的查询,它成为候选解决方案sqlfiddle.com/#!9/65a35/15
猜你喜欢
  • 1970-01-01
  • 2017-09-04
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多