【问题标题】:Select rows which depend on conditions on n other rows - mysql选择取决于其他 n 行条件的行 - mysql
【发布时间】:2011-11-23 06:36:03
【问题描述】:

我不知道如何正确表达标题,所以如果给出错误的想法,请纠正它。
这是一个名为 table1 的示例表:

id    name1    number1    name2    number2
...   ...      ...        ...      ...
341   A        12         T        10
342   C        17         A        21
343   H        15         G        3
344   C        10         A        11
345   T        15         G        16
...   ...      ...        ...      ...

这是我想要选择的,n=3

 id    name1    number1    name2    number2    number3
 ...   ...      ...        ...      ...        ...
 341   A        12         T        10         ...
 342   C        17         A        21         ...
 344   C        10         A        11         11-10+21-17+12-10
 351   D        9          A        5          5-9+11-10+21-17
 360   A        18         C        10         18-10+5-9+11-10
 503   A        21         K        16         9
 ...   ...      ...        ...      ....       based on last 3 where name1 or name2=A

如您所见编号_i 属于名称_i,i=1,2
条件:
- name1name2 必须是 A
- number3 取决于最后 3 个 number_i 条目(包括当前),其中 name_i=A, i=1,2

【问题讨论】:

  • 我不反对我的问题被否决,但你能给我一些解释以便我解决它吗?

标签: mysql select conditional-statements


【解决方案1】:

以下内容应该可以帮助您入门。

请注意,还有很大的改进空间,但由于我对 MySQL 缺乏了解,我采取了应该适用于每个 DBMS 的安全路线。

SQL 语句

SELECT  id
        , name1
        , number1
        , name2
        , number2
        , r1number1 - r1number2 + r2number1 - r2number2 + r3number1 - r3number2
FROM    ( 
          SELECT  r1.id
                  , r1.name1
                  , r1.number1
                  , r1.name2
                  , r1.number2
                  , r1number1 = CASE WHEN r1.name1 = 'A' THEN r1.number1 ELSE r1.number2 END
                  , r1number2 = CASE WHEN r1.name1 = 'A' THEN r1.number2 ELSE r1.number1 END
                  , r2number1 = CASE WHEN r2.name1 = 'A' THEN r2.number1 ELSE r2.number2 END
                  , r2number2 = CASE WHEN r2.name1 = 'A' THEN r2.number2 ELSE r2.number1 END
                  , r3number1 = CASE WHEN r3.name1 = 'A' THEN r3.number1 ELSE r3.number2 END
                  , r3number2 = CASE WHEN r3.name1 = 'A' THEN r3.number2 ELSE r3.number1 END
          FROM    (
                    SELECT  r1id = r1.id, r2id = MAX(r2.id), r3id = MAX(r3.id)
                    FROM    (SELECT * FROM q WHERE name1 = 'A' OR name2 = 'A') r1
                            LEFT OUTER JOIN (SELECT * FROM q WHERE name1 = 'A' OR name2 = 'A') r2 ON r2.id < r1.id
                            LEFT OUTER JOIN (SELECT * FROM q WHERE name1 = 'A' OR name2 = 'A') r3 ON r3.id < r2.id
                    GROUP BY
                            r1.id
                  ) rid
                  INNER JOIN (SELECT * FROM q WHERE name1 = 'A' OR name2 = 'A') r1 ON r1.id = rid.r1id
                  LEFT OUTER JOIN (SELECT * FROM q WHERE name1 = 'A' OR name2 = 'A') r2 ON r2.id = rid.r2id
                  LEFT OUTER JOIN (SELECT * FROM q WHERE name1 = 'A' OR name2 = 'A') r3 ON r3.id = rid.r3id
        ) r                  

【讨论】:

  • 我必须给它一个更好的外观,但乍一看我得到:错误 1054 (42S22): '字段列表'中的未知列 'r1id'
  • @enedene - 我已经在 SQL Server 上测试过它(它工作的地方)。唯一的改变是查找和替换一个 SELECT * ... WHERE name1...)
猜你喜欢
  • 1970-01-01
  • 2013-11-29
  • 2020-12-24
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
相关资源
最近更新 更多