Php 将多行从多到多分组为一行

Php 将多行从多到多分组为一行,php,mysql,Php,Mysql,因此,我刚刚开始学习SQL编程,并着手建立两个表和一个透视表之间的多对多关系。我将通过一个API发送这些信息,在我的前端以一种简单的方式循环数据会很酷 这些表如下所示: 故事模板 id、标题、正文、作者 空白 id、title、description 空白故事模板(透视) id、sid、bid、position 我已使用此查询获取了所需的信息: SELECT st.title, st.body, st.author, b.*, bst.position FROM st

因此,我刚刚开始学习SQL编程,并着手建立两个表和一个透视表之间的多对多关系。我将通过一个API发送这些信息,在我的前端以一种简单的方式循环数据会很酷

这些表如下所示:

故事模板

id、标题、正文、作者

空白

id、title、description

空白故事模板(透视)

id、sid、bid、position

我已使用此查询获取了所需的信息:

SELECT 
    st.title, st.body, st.author, 
    b.*,
    bst.position
FROM story_template AS st
       INNER JOIN blanks_story_template AS bst ON st.id = bst.sid
       INNER JOIN blanks AS b ON bst.bid = b.id
       ORDER BY bst.position
结果如下:

所以我想知道的是,是否可以将多行合并为一行?例如,上面的结果如下所示:

st.id, title, body, author, b.id, title, description, position
--------------------------------------------------------------
1      title  body  author  1,    title, description, position
                            2,    title, description, position
                            3,    title, description, position
2      title  body  author  1,    title, description, position
                            2,    title, description, position
                            3,    title, description, position
我已经研究了GROUP_CONCAT(),如果所有列都有值,那么这就行了,从那时起,我就可以将它们拆分成一个数组。但这并没有真正帮助我,因为如果
blank.description
在一行上为空,那么我将丢失属于它的
blank.id

这在查询中是可行的,还是我必须在用API发送之前解析它


如果有任何内容看起来模糊,我深表歉意,如果您需要我澄清任何内容,我很乐意这样做。

您可以在MySQL中使用用户变量来判断一行是否与前一行对应。您需要按更改
顺序,以便相同的
故事模板
的行放在一起

SELECT IF(id = @last_st, '', id) AS id,
       IF(id = @last_st, '', title) as title,
       IF(id = @last_st, '', body) as body,
       IF(id = @last_st, '', author) AS author,
       blank_id, blank_title, description, position,
       @last_st := id
FROM (
    SELECT 
        st.id, st.title, st.body, st.author, 
        b.id AS blank_id, b.title AS blank_title, b.description,
        bst.position
    FROM story_template AS st
           INNER JOIN blanks_story_template AS bst ON st.id = bst.sid
           INNER JOIN blanks AS b ON bst.bid = b.id
           ORDER BY st.id, b.id
    ) AS x
CROSS JOIN (SELECT @last_id := null) AS y

能否尝试将bst.bid=b.id上的
内部连接空格更改为b.bid=b.id上的
右侧外部连接空格更改为b.bid=b.id
?更好地抑制PHP中的重复值:请参见@DarshanMehta,它不会影响结果。trincot那么在SQL中没有好的方法可以做到这一点吗?您在第二个
选择
时出错,其中
st.st\u id
需要更改为
st.id AS st\u id
,并且在
ORDER BY
中相同。然而,它并没有解决这个问题,它所做的只是添加了另一个带有story_模板id的列。或者我理解错了吗?我修正了它,在整个过程中只使用
id
,并且只为
b.id
添加前缀。啊哈,酷!现在它按照问题中的描述工作。这样做会减少查询时间吗?跳过st.body(有时是很长的文本)时,还是仍然加载st.body,但只是将其隐藏在结果中?它会减少从服务器传输到客户端的数据量。因此,如果它们被一个缓慢的网络链接隔开,可能会产生明显的不同。如果客户端和服务器在同一台机器上,我怀疑会有显著的减少。