0

这似乎是一个令人费解的问题,但我会尽力阐明这个想法并说明一个场景。本质上,我有两个表需要组合并作为单个查询的结果集返回。一个表需要按特定顺序合并到另一个表中。

说表一称为Articles,表二称为Features。两个表都有一个带有唯一编号的ID字段。文章有一个日期字段,该字段将用于最初按降序对其记录进行排序。Features表有一个Delta字段,最初用于对其记录进行排序。Features表中的一些记录是占位符,并不意味着包含在最终集中。它们的唯一目的是影响排序顺序。每条记录在Delta字段中都有一个唯一值,从 1 - X 将用于对这些记录进行排序。另一个名为Skip的字段的值为1如果将两个表合并在一起时应该消除它。同样,跳过记录的唯一目的是在Features表的初始排序期间占用空间。即使它们是不必要的,它们也存在并且不能被删除。

棘手的部分是,当两个表的结果合并时,Features 表中的任何未跳过的记录都需要按照它们在Features表中出现的确切顺序插入到Articles表的结果中。

因此,假设我在Features表中有 6 条记录 A - F,并且 order 字段的范围为 1 - 6。记录 A、B、D、E 在Skip字段中的值都为 1。这意味着我只对记录 C 和 F 感兴趣,这两个记录都需要分别插入到位置 3 和 6 的最终记录集中。

Articles表的记录可能如下所示:

+----+------------+
| id |    date    | 
+----+------------+
| 1  | 9999999999 |
+----+------------+
| 2  | 9999999998 |
+----+------------+
| 3  | 9999999997 |
+----+------------+
| 4  | 9999999996 |
+----+------------+
| 5  | 9999999995 |
+----+------------+
| 6  | 9999999994 |
+----+------------+
| 7  | 9999999993 |
+----+------------+
| 8  | 9999999992 |
+----+------------+
| 9  | 9999999991 |
+----+------------+
| 10 | 9999999990 |
+----+------------+

功能表可能如下所示:

+----+------+-------+------+
| id | name | delta | skip |
+----+------+-------+------+
| 11 |   A  |   1   |   1  |
+----+------+-------+------+
| 12 |   B  |   2   |   1  |
+----+------+-------+------+
| 13 |   C  |   3   |   0  |
+----+------+-------+------+
| 14 |   D  |   4   |   1  |
+----+------+-------+------+
| 15 |   E  |   5   |   1  |
+----+------+-------+------+
| 16 |   F  |   6   |   0  |
+----+------+-------+------+

结果看起来像这样(不包括实现我的目标可能需要的任何其他字段):

+----+
| id |
+----+
| 1  |
+----+
| 2  |
+----+
| 13 | (record from the Features table in the third position)
+----+
| 3  |
+----+
| 4  |
+----+
| 16 | (record from the Features table in the sixth position)
+----+
| 5  |
+----+
| 6  |
+----+
| 7  |
+----+
| 8  |
+----+
| 9  |
+----+
| 10 |
+----+

希望我的解释是有道理的。有任何想法吗?

谢谢,豪伊

4

2 回答 2

0

我假设您的示例中有一个错误 - 记录 id=16 是 Features 表中的第六行,因此应该在结果中的 id=5 之后,而不是之前。

试试 blelow 查询。这是SQLFiddle

select id from (
  select `date`, null delta, id
  from Articles
  union all
  select a.`date`, f.delta, f.id 
  from ( 
    select (@x:=@x+1) rn, a.*
    from Articles a, (select @x:=0) z
    order by a.`date` desc
  ) a
  join (
    select (@y:=@y+1) rn, f.id, f.delta, f.skip
    from Features f, (select @y:=0) z
    order by f.delta
  ) f
  on a.rn = f.rn
  where f.skip <> 1
  order by `date` desc, isnull( delta ), delta 
) merge
于 2013-07-29T19:31:54.963 回答
0

看起来SQL Fiddle 中的这个例子是为我做的。

SELECT id, sort_order FROM (
SELECT `date`, NULL delta, id, (@a_count:=@a_count+1) sort_order
  FROM Articles a_main, (SELECT @a_count:=-1) z

  UNION ALL

SELECT a.`date`, f.delta, f.id, f.weighted_rn
  FROM (
    SELECT (@x:=@x+1) rn, a.*
    FROM Articles a, (SELECT @x:=-1) z
    ORDER BY a.`date` DESC
  ) a

JOIN (
    SELECT (@y:=@y+1) rn, TRUNCATE((f.delta - @y - (1/@y)),2) AS weighted_rn, f.id, f.delta, f.skip
    FROM Features f, (SELECT @y:=-1) z
    WHERE f.skip <> 1
    ORDER BY f.delta
  ) f

ON a.rn = f.rn
ORDER BY sort_order
) merge

感谢Kordirko的框架。

于 2013-07-30T00:29:19.463 回答