从循环记录中获取记录ID

时间:2014-04-12 18:33:41

标签: mysql

这是故事

我有两个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

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

有什么想法吗?

谢谢 范哲利斯

2 个答案:

答案 0 :(得分:3)

问题是 - 你只能用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之间没有持久性 - 那么您将不得不在应用程序中处理

答案 1 :(得分:0)

参考我之前所说的 - 如果你是在php中做的,这是你想要做的sql选择以正确的格式获取数据..从这里你可以做一个循环里面php中的一个循环,其中一个限制设置为在2处打破..应该可以做到这一点

SELECT 
    m.id AS master_id, 
    m.descr, 
    d.id AS detail_id
FROM master m
JOIN details d ON d.masterid = m.id