mySQL-如何展平记录和子记录

mySQL-如何展平记录和子记录,mysql,sql,Mysql,Sql,我有两张桌子,是这样的: records [id, submitted_date, username] 1, 2012-10-20, jjones 2, 2012-10-22, jsmith subrecords [id, record, name, value] 1, 1, Street, 123 Elm 2, 1, City, Chicago 3, 2, Street, 321 Maple 4, 2, City, New York 我正在使用一个表单工具

我有两张桌子,是这样的:

records
[id, submitted_date, username]

1,  2012-10-20, jjones
2,  2012-10-22, jsmith


subrecords
[id, record, name, value]

1,  1,  Street, 123 Elm
2,  1,  City,   Chicago
3,  2,  Street, 321 Maple
4,  2,  City,   New York
我正在使用一个表单工具,以这种方式保存东西

但是,在单独的定制PHP中,我希望得到如下查询结果:

jjones, 123 Elm, Chicago
jsmith, 321 Maple, New York
我该怎么做?到目前为止,我能想到的最好的输出是

jjones, Street, 123 Elm
jjones, City, Chicago
jsmith, Street, 321 Maple
jsmith, City, New York

这不是我需要的。我想在查询返回的数据行中获得所有结果。

我面前没有MySQL服务器来测试它,但是类似的东西

select records.username, group_concat(subrecords.value separator ', ') as concatenated
from records join subrecords
on records.id = subrecords.record
group by records.username
select a.id, group_concat(concat('~',b.id,b.name,b.value) seperator ',')
from a join b on b.record=a.id
group by a.id
我不确定它是否有效,因为我还没有测试。如果有任何问题,请告诉我,以便我可以编辑答案,使其更有帮助


干杯。

你需要做一些像group_concat这样的事情,把“子结果”放在一个字符串中,如果有多个列,结果可能会很难看。。类似于~或|分隔列和分隔记录

差不多

select records.username, group_concat(subrecords.value separator ', ') as concatenated
from records join subrecords
on records.id = subrecords.record
group by records.username
select a.id, group_concat(concat('~',b.id,b.name,b.value) seperator ',')
from a join b on b.record=a.id
group by a.id
我想你也可以把它分成不同的小组,就像这样:

select a.id, group_concat(b.id seperator ',')
group_concat(b.id seperator ',') ids
group_concat(b.name seperator ',') names
group_concat(b.value seperator ',') values
from a join b on b.record=a.id
group by a.id

在客户端,无论你觉得哪一个比较容易处理。

只需加入子记录两次,一次用于街道,一次用于城市:

select r.username, street.value, city.value
from records r
join subrecords street
  on street.record = r.id
   and street.name = 'Street'
join subrecords city
  on city.record = r.id
   and city.name = 'City'
order by r.username;

和前面的答案一样,我还不能测试这个。如果group_concat导致问题,派生表是否也可以工作

SELECT r.username, s1.value, s2.value
FROM
    records r
JOIN
    (SELECT value FROM subrecords WHERE name="Street") s1
ON
    (r.id = s1.record)
JOIN
    (SELECT value FROM subrecords WHERE name="City") s2
ON
    (r.id = s2.record)

这似乎是正确的方向,但是否有方法对串联的值进行排序?它们似乎是以半随机顺序排列的,因此每个记录的位置都不匹配,例如,第1排-琼斯,123 Elm,芝加哥第2排-杰米特,纽约,321 Maple。您可以使用order by子句来实现这一点。啊,是的。我修正了打字错误,现在是r.id。