mysql – 从循环记录中获取记录ID

这是故事

我有两个mysql表,如:

id, descr
1, master 1
2, master 2

细节

id, descr, masterid
1, test 1, 1
2, test 2, 1
3, test 3, 1
4, test 1, 2
5, test 2, 2
6, test 3, 2

我需要一个查询来获取第一个表中的行和详细信息中的循环列

例如 :

首先执行:

1,master 1, 1

2,master 2, 4

第二次执行

1,master 1, 2<- From the details table

2,master 2, 5<- From the details table

第三次执行

1,master 1, 3<- From the details table

2,master 2, 6<- From the details table

第四次执行:

1,master 1, 1

2,master 2, 4

我想我必须在主表上添加一列以保留详细信息表中的最后一个选定记录,但我无法设计查询.

有任何想法吗?

谢谢
范吉利斯

最佳答案
问题是 – 你只能用SQL来做.但这将与会话相关.通过这个,我的意思是这个查询:

SELECT
  master.*,
  o.id AS oid
FROM
  master
    INNER JOIN
    (SELECT
      d.*,
      @num:=IF(@id=masterid, @num:=@num+1, 1) AS num,
      @id:=masterid
    FROM
      (SELECT * FROM details ORDER BY masterid) AS d
      CROSS JOIN 
       (SELECT @id:=0, @num:=0) AS init
     ) AS o
    ON master.id=o.masterid
    INNER JOIN
    (SELECT 
       masterid,
       COUNT(id) AS c 
     FROM 
       details 
     GROUP BY 
       masterid) AS counts
    ON master.id=counts.masterid
    CROSS JOIN 
      (SELECT @RUN_COUNT:=IF(@RUN_COUNT IS NULL, 1, @RUN_COUNT+1)) AS r
WHERE
  o.num=IF(!(@RUN_COUNT%(counts.c)), counts.c, @RUN_COUNT%(counts.c));

非常重要的细节是@RUN_COUNT.它只会在一个会话中循环.也就是说:如果您将启动另一个会话,则会再次初始化此变量:

(SELECT @RUN_COUNT:=IF(@RUN_COUNT IS NULL, 1, @RUN_COUNT+1)) AS r

– 你可以看到,这只是检查它是否未初始化 – 如果不是,那么它将初始化它.所以,如果你在不同的会议中表演,这将失败.

SQLFiddle的行为就像一个会话,因此它是working there(但是你需要先将@RUN_COUNT设置为NULL,当然 – 因为我已经运行了这个查询)

如果对于不同的主ID有不同的计数,上面的查询将起作用(就像我在小提琴中所做的那样,4对于masterid = 1而3对于masterid = 2).但是 – 再一次,在常见情况下你不能依赖@RUN_COUNT.如果您的会话在您的应用程序和DBMS之间不是持久的 – 那么您将不得不在应用程序中处理它.

转载注明原文:mysql – 从循环记录中获取记录ID - 代码日志