1

我尝试在 SO 中找到这个问题的答案,但找不到任何答案。任何链接都会有很大帮助。

我有一个父表和一个子表,父表和子表之间存在一对多关系。子表包含大约 100 万条记录,我想为每个父记录在子表中创建一个包含第 10 条记录的视图。例子-

Parent_Table - Fields -- ID, Name
ID       Name
----     -----
1        A
2        B
3        C

Child_Table - Fields -- ID, ParentID, Date, Data
ID  ParentID  Date    Data
--------------------------
1     1        04/10   A1
2     1        04/11   A2
3     1        04/11   A3
4     1        04/12   A4
5     1        04/12   A5
6     2        04/10   B1
7     2        04/11   B2
8     2        04/12   B3
9     2        04/12   B4
10    2        04/13   B5
11    2        04/13   B6

现在,我想为按日期排序的每个父记录创建一个包含第一条 4 条记录的视图。

预期产出

ID  ParentID  Date    Data
--------------------------
1     1        04/10   A1
2     1        04/11   A2
3     1        04/11   A3
4     1        04/12   A4
6     2        04/10   B1
7     2        04/11   B2
8     2        04/12   B3
9     2        04/12   B4

任何链接或解决方案指南将不胜感激。提前致谢!

如果您需要任何澄清,请发表评论。

4

2 回答 2

1

我在我的电脑上试用了这个,它使用您自己的数据根据​​您的要求显示。我更改了一些字段名称,例如将 Child 的 ID 更改为 ChildID,将 Date 更改为 ChildDate,将 Data 更改为 ChildData。这里是:

SELECT * FROM 
(SELECT ParentID, ChildID, ChildDate, ChildData, @ChildRank:= CASE WHEN @Parent <> ParentID THEN 1 ELSE @ChildRank+1 END as ChildRanking, @Parent := ParentID as Parent FROM 
(SELECT @ChildRank:=0) CR, (SELECT @Parent:=1) P, (SELECT * FROM Child_Table ORDER BY
ParentID, ChildID) MainTable) AllTable WHERE ChildRanking <=4;

我只使用子表,但无论如何,如果你愿意,你可以将它与 Parent_Table 进行 INNER JOIN。

一点解释:

1) ChildRank 将从 Rank 0 开始(即 SELECT @ChildRank:0)但由于 @ChildRank+1 它将从 Rank 1 开始

2) 当新的 ParentID (即@Parent<> ParentID) 然后立即从 Rank 1 开始。

3) AllTable 是所有内容的别名,因此您现在可以引用 ChildRanking 字段。

如果您不想显示 ChildRanking 字段,则必须指定要显示的字段。

于 2013-04-14T05:25:01.827 回答
1

如果你需要创建一个视图,你可以使用这样的东西:

CREATE VIEW First_Four AS
SELECT c1.*
FROM
  Child_Table c1 LEFT JOIN Child_Table c2
  ON c1.ParentID = c2.ParentID
     AND (STR_TO_DATE(c1.`date`, '%m/%Y')>STR_TO_DATE(c2.`date`, '%m/%Y')
          OR (STR_TO_DATE(c1.`date`, '%m/%Y')=STR_TO_DATE(c2.`date`, '%m/%Y')
              AND c1.ID>c2.ID)
         ) 
GROUP BY
  c1.ID, c1.ParentID, c1.`Date`, c1.Data
HAVING
  COUNT(c2.ID)<4

我将字段数据视为 VARCHAR 列,因此我们需要使用 STR_TO_DATE,如果不是,我们可以只比较 c1。date与 c2。date直接地。

在此处查看小提琴。

于 2013-04-14T07:07:27.600 回答