2012-01-11 65 views
3

这已经极大地更新,因为我走近解决方案如何SQL SELECT一个一对多的关系和合并输出

我猜的标题是不是最好的,但我不知道该如何解释它更好。

我有坐标在两个相关表中的位置。表locations(id, name, description, created_at)locations_coordinates(location_id, lat, lng, coordinates_order)

我存储未知数量的坐标(多边形),这就是为什么我使用两个表。

现在我运行下面的查询

SELECT l.id, 
    l.name, 
    l.description, 
    l.created_at, 
    GROUP_CONCAT(Concat(c.lat, ":", c.lng) ORDER BY c.coordinate_order ASC 
    SEPARATOR 
    ', ') AS coordinates 
FROM locations l 
    LEFT JOIN locations_coordinates c 
    ON l.id = c.location_id 
WHERE l.id = ' . $id . ' 
GROUP BY l.id, 
     l.name, 
     l.description, 
     l.created_at ASC 

,所以我得到下面的输出(使用ID = 3)

[ 
{ 
    "id":"3", 
    "name":"Stadthalle", 
    "description":"Die Wiener Stadthalle", 
    "created_at":"2012-01-07 14:22:06", 
    "coordinates":"48.201187:16.334213, 48.200665:16.331606, 48.202989:16.331091,  48.203075:16.334192" 
} 
] 

什么,我想获得的是纬度和经度配对在一起,如:

[ 
{ 
    "id":"3", 
    "name":"Stadthalle", 
    "description":"Die Wiener Stadthalle", 
    "created_at":"2012-01-07 14:22:06", 
    "coordinates":[ 
    [ 
     "48.201187,16.334213" 
    ], 
    [ 
     "48.200665,16.331606" 
    ], 
    [ 
     "48.202989,16.331091" 
    ], 
    [ 
     "48.203075,16.334192" 
    ] 
    ] 
} 
] 

所以我的问题是:有没有办法只用SQL来获取所需的输出?如果没有,我的查询是否可以改进,这样我就可以更容易地使用应用程序代码来执行它(PHP适合我)?

UPDATE:使用的MyISAM并在 “locations_coordinates” 表中, “locations_id” 和 “coordinates_order”

我真的是PRIMARY和 “coordinates_order” 被设定为AUTO INCREMENT,因此插入时始终会启动一系列新的订单号。 (我需要这个,所以我可以在以后按正确的顺序选择坐标)。

回答

0

只要你设置外键(如果需要多个),但是请确保你索引的键速度更快。

那么相信你能做到多加入像你上面提到的,只要位置和坐标,有外键user.id

我前几天回答过类似的问题实际上(滑稽足够它不得不做与地点/坐标),不幸我不能点击任何链接今晚向您转发,也许浏览我的个人资料。

+0

我使用MyISAM,在“locations_coordinates”表中,“locations_id”和“coordinates_order”是PRIMARY,并且“coordinates_order”设置为AUTO INCREMENT,因此插入时总是会启动一系列新的订单号。 (我需要这个,所以我可以在以后按正确的顺序选择坐标)。我不确定你的意思是由user.id? – 2012-01-11 11:59:50

0

我解决这样类似的问题:

首先,让所有的位置记录我的需要,把它们放在一个哈希映射与ID为关键。

其次,获取location_id在location记录id中的所有坐标记录。 也许:select * from坐标where location_id in(?,?,...)

三,迭代坐标记录并将lat和lng列设置为相应的位置记录。

如果位置记录的大小不是太大,它只需要两条SQL语句。因此,我们获得了更好的表现。