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

时间:2013-12-26 21:01:11

标签: 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

我正在使用以这种方式保存的表单工具。

但是,在单独的自定义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

这不是我需要的。我想在查询返回的数据行中一起得到结果。

4 个答案:

答案 0 :(得分:2)

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

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;

答案 1 :(得分:0)

我面前没有MySQL服务器来测试它,但是像

那样
select records.username, group_concat(subrecords.value separator ', ') as concatenated
from records join subrecords
on records.id = subrecords.record
group by records.username

我不确定它是否有效,因为我没有测试过。如果有任何问题,请告诉我,以便我可以编辑答案,使其更有帮助。

干杯。

答案 2 :(得分:0)

你需要做一些像group_concat这样的东西把“子结果”放到一个单独的字符串中,而且有多个列它可能会变得丑陋......就像〜或者分隔的列和分隔的记录

类似

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_concats:

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
无论你在客户端遇到什么样的痛苦都不那么痛苦。

答案 3 :(得分:0)

与之前的答案一样,我还无法测试。如果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)