Как вертеться схема значения атрибута объекта MySQL

Вы можете создать объект для сопоставления каждого типа с соответствующим компонентом. Примерно так будет работать:

const LayerVillage = ({ position, name }) => (
  <Marker position={position} icon={locationIcon}>
    <TooltipComponent permanent direction="bottom" opacity={0.6}>
      {name}
    </TooltipComponent>
  </Marker>
);

const layerComponentsByType = {
  village: LayerVillage,
  town: LayerTown
};

const stuff = data.map(location => {
  const LayerControl = layerComponentsByType[location.type];
  return (
    <LayerControl
      key={location.id}
      position={[location.lat, location.lng]}
      name={location.name}
    />
  );
});

Другая возможность заключается в следующем:

    <LayerControl
      key={location.id}
      {...location}
    />

Таким образом, вы получите пары ключ-значение объекта местоположения в качестве свойств.

Кроме того, у вас может быть компонент по умолчанию, поскольку location.type не может быть свойством layerComponentsByType:

  const LayerControl = layerComponentsByType[location.type] || DefaultLayerControl;
25
задан outis 30 March 2012 в 19:31
поделиться

5 ответов

Вопрос упоминает MySQL, и на самом деле этот DBMS имеет специальную функцию для этого вида проблемы: GROUP_CONCAT(expr). Смотрите в справочник MySQL на группе функциями . Функция была добавлена в версии 4.1 MySQL. Вы будете использовать GROUP BY FileID в запросе.

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

SELECT bt.FileID, Title, Author, 
 GROUP_CONCAT(
  CONCAT_WS(':', at.AttributeName, at.AttributeType, avt.AttributeValue) 
  ORDER BY at.AttributeName SEPARATOR ', ') 
FROM BaseTable bt JOIN AttributeValueTable avt ON avt.FileID=bt.FileID 
 JOIN AttributeTable at ON avt.AttributeId=at.AttributeId 
GROUP BY bt.FileID;

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

'F001', 'Dox', 'vinay', 'CustomAttr1:varchar(40):Akash, CustomUseDate:Datetime:2009/03/02'

Этот способ, которым Вам только нужны один единственный запрос DB и вывод, легко проанализировать. Если бы Вы хотите сохранить атрибуты как реальную Дату и время и т.д. в DB, необходимо было бы использовать динамический SQL, но я избегу от этого и сохраню значения в varchars.

21
ответ дан nawroth 28 November 2019 в 21:04
поделиться

Общая форма такого запроса была бы

SELECT file.*,
   attr1.value AS 'Attribute 1 Name', 
   attr2.value AS 'Attribute 2 Name', 
   ...
FROM
   file 
   LEFT JOIN attr AS attr1 
      ON(file.FileId=attr1.FileId and attr1.AttributeId=1)
   LEFT JOIN attr AS attr2 
      ON(file.FileId=attr2.FileId and attr2.AttributeId=2)
   ...

, Таким образом, необходимо динамично создать запрос из атрибутов, в которых Вы нуждаетесь. В псевдокоде php-выхода

$cols="file";
$joins="";

$rows=$db->GetAll("select * from Attributes");
foreach($rows as $idx=>$row)
{
   $alias="attr{$idx}";
   $cols.=", {$alias}.value as '".mysql_escape_string($row['AttributeName'])."'";   
   $joins.="LEFT JOIN attr as {$alias} on ".
       "(file.FileId={$alias}.FileId and ".
       "{$alias}.AttributeId={$row['AttributeId']}) ";
}

 $pivotsql="select $cols from file $joins";
9
ответ дан Paul Dixon 28 November 2019 в 21:04
поделиться

Это - стандарт "строки к столбцам" проблема в SQL.

Это наиболее легко сделано вне SQL.

В Вашем приложении, сделайте следующее:

  1. Определяют простой класс для содержания файла, системных атрибутов и Набора пользовательских атрибутов. Список является хорошим выбором для этого набора потребительских атрибутов. Давайте назовем этот класс FileDescription.

  2. Выполняют простое соединение между файлом и всеми потребительскими атрибутами для файла.

  3. Запись цикл для сборки FileDescriptions от результата запроса.

    • Выборка первая строка, создайте FileDescription и установите первый потребительский атрибут.

    • , В то время как существует больше строк для выборки:

        <литий> Выборка строка <литий>, Если имя файла этой строки не соответствует FileDescription, мы создаем: закончите создавать FileDescription; добавьте это к Набору результата Описаний файлов; создайте новый, пустой FileDescription с именем и первым потребительским атрибутом. <литий>, Если имя файла этой строки соответствует FileDescription, мы создаем: добавьте другой потребительский атрибут к текущему FileDescription
6
ответ дан S.Lott 28 November 2019 в 21:04
поделиться

Однако существуют решения использовать строки в качестве столбцов, иначе транспонировать данные. Это включает приемы запроса, чтобы сделать это в чистом SQL, или необходимо будет полагаться на определенные функции только avaible в определенной базе данных, с помощью Сводных таблиц (или Кросс-таблицы).

Как exemple Вы видите, как сделать это здесь в Oracle (11 г).

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

0
ответ дан MarmouCorp 28 November 2019 в 21:04
поделиться

Частичный ответ, так как я не знаю MySQL (хорошо). В MSSQL я посмотрел бы на Сводные таблицы или составлю временную таблицу в хранимой процедуре. Это может быть трудное время...

-2
ответ дан Sascha 28 November 2019 в 21:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: