Как отобразить данные из БД, когда строки и столбцы инвертированы - PullRequest
1 голос
/ 16 мая 2011


Мне приходится иметь дело с таблицей, подобной этой, примерно с парой сотен #id (и с подсчетом).

id     field_name     field_value  
1      name           pasta  
1      lat            41.27651  
1      long           11.45234  
2      name           pizza  
2      lat            43.53455 
2      long           12.62346
..     ....           ........
..     ....           ........
..     ....           ........

Мне нужно создать файл XML, который позволит мнедобавить маркеры на Google Map со структурой, подобной этой:

<makers>
    <marker name="$name" lat="$lat" long="$long" />
    <marker name="$name" lat="$lat" long="$long" />
    (...)
</markers>

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

$query = "  SELECT field_val
        FROM table
        WHERE field_name='Name'";

Основная проблема в том, что я не могу работать с такой структурой, учитывая тот факт, что, вероятно, лучшая структура была бы похожаthis

id    name    lat       long
1     pasta   41.27651  11.45234
2     pizza   43.53455  12.62346
..    ...     ...       ...

Обратите внимание, что я не могу изменить способ, которым записи идут в БД, и что структура таблицы более сложная, чем показанная здесь (с приблизительно 15 field_name на id,не все из них необходимы).

Извините за плохой английский и спасибо за ваше время.

Ответы [ 3 ]

1 голос
/ 16 мая 2011
SELECT 
  id,
  GROUP_CONCAT(if(fieldname='name', field_value, NULL)) AS 'name', 
  GROUP_CONCAT(if(fieldname='lat', field_value, NULL)) AS 'lat', 
  GROUP_CONCAT(if(fieldname='long', field_value, NULL)) AS 'long' 
FROM table 
GROUP BY id; 
0 голосов
/ 16 мая 2011

Имеется модель EAV (Entity-Attribute-Value), и если вы хотите «инвертировать» (правильный термин - pivot), то вы либо используете PHP для этого, либо вы самостоятельно присоединяетесь к таблице раз, как у вас есть "столбцы". Чтобы получить результат из MySQL, который дал бы вам макет на основе столбцов, представляющий name, lat, long - вы должны самостоятельно присоединиться к таблице в столбце id 3 раза.

0 голосов
/ 16 мая 2011

Ваш запрос выглядит хорошо. Теперь, предполагая, что для полных данных вам всегда потребуется 3 строки, попробуйте следующий непроверенный код

$myXmlData = '<makers>'; // create first line of your xml

$myCoutner = 0;
$query = "  SELECT field_value FROM table ORDER BY id ";
$result = mysql_query($query) or die (mysql_error());
while ($row = mysql_fetch_assoc($result))
{
    $myCoutner++;
    if ($myCoutner<=3)  // for the 3 first lines
    {
        $myMarker_data .= ' name = "'.stripslashes($row['field_value']).'" ';
        $myMarker_data .= ' lat = "'.stripslashes($row['field_value']).'" ';
        $myMarker_data .= ' long = "'.stripslashes($row['field_value']).'" ';
    }

    // if we have data
    if ($myCoutner==3)
    {
        if ($myMarker_data!='')
        {
            // add data to main xml
            $myXmlData .= '<marker '.$myMarker_data.' />';
        }

        $myCoutner = 0;  // reset coutner to start clunting 3 new lines
        $myMarker_data = ''; // reset var to hold temp data
    }
}
$myXmlData .= '</markers>';  // create last line of your xml
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...