这是故事
我有两个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
我想我必须在主表上添加一列来保留详细信息表中最后选择的记录,但我无法设计查询。
有什么想法吗?
谢谢 范哲利斯
答案 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