Как SQL Выберите отношение один ко многим и объедините вывод - PullRequest
3 голосов
/ 11 января 2012

Это было существенно обновлено, так как я приблизился к решению

Я думаю, что название не самое лучшее, но я не знал, как это объяснить лучше.

У меня есть местоположения с координатами в двух связанных таблицах.Таблица 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)?

ОБНОВЛЕНИЕ:

Я использую MyISAM и в таблице "location_coordinates" значения "location_id" и "arguments_order" равны PRIMARY , а для "arguments_order" установлено значение AUTO INCREMENT , поэтому он всегда начинаетсяновая серия номеров заказов при вставке.(Мне нужно это, чтобы я мог выбрать координаты в правильном порядке позже.)

Ответы [ 2 ]

0 голосов
/ 11 января 2012

Я решаю подобные проблемы следующим образом:

Во-первых, получите все записи о местоположении, которые мне нужны, Поместите их в хэш-карту с ID в качестве ключа.

Во-вторых, получите всекоординатные записи, где location_id в id записей местоположения.Возможно: выбрать * из координаты где location_id в (?,?, ...)

В-третьих, выполнить итерацию записей координат и установить столбцы lat и lng в соответствующую запись местоположения.

ЕслиРазмер местоположения записи не слишком велик, для этого нужно всего два оператора SQL.Таким образом, мы получаем лучшую производительность.

0 голосов
/ 11 января 2012

до тех пор, пока вы устанавливаете внешние ключи (несколько, если необходимо), однако убедитесь, что вы индексировали ключи для большей скорости.

, тогда убедитесь, что вы можете сделать несколько соединений, как упомянуто выше, до тех пор, пока местаи координаты имеют внешний ключ user.id

На самом деле я ответил на аналогичный вопрос несколько дней назад (достаточно забавно, это было связано с местоположениями / координатами), к сожалению, сегодня вечером я не могу нажать на любые ссылки, чтобы переслать вас,возможно, просмотрите мой профиль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...