MySQL динамически объединяет / выбирает выбранные строки - PullRequest
0 голосов
/ 11 января 2011

Мне просто нужно какое-то руководство по этому вопросу.У меня есть следующие таблицы:

Table: entity
 - ID (INT)

Table: attributes
 - ID (INT)
 - name (VARCHAR)
 - internalname (VARCHAR)

Table: values
 - ID (INT)
 - entity (ID)
 - attributes (INT)
 - value (Text)

То, что я хочу, - это создание выбора, который будет возвращать что-то вроде следующего:

 - ID = entity.ID
 - {attributes.internalname ID 1} = values.{attribe internalname 1}.value
 - {attributes.internalname ID 2} = values.{attribe internalname 2}.value
 - {attributes.internalname ID 3} = values.{attribe internalname 3}.value
 - {attributes.internalname ID n} = values.{attribe internalname n}.value
 - etc...

Это было бы как объединение:

SELECT entity.id FROM entity;

и

SELECT (SELECT values.value FROM values WHERE values.entity = entity.ID AND values.attributes = attributes.ID) FROM attributes;

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

Я действительно хочу повернуть всезначения в атрибутах столбцов и превращают все значения в значения соответствующих атрибутов с идентификатором в качестве селектора.

Я даю запросу идентификатор (идентификатор элемента), и в одной строке результата он возвращает все данные.

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 12 января 2011

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

Если атрибуты (1,2,3,4) представляют (имя, фамилия, имя, дополнительное имя, дополнительное имя)Вы можете запросить его следующим образом:

select e.id
      ,v1.value as firstname
      ,v2.value as lastname
      ,v3.value as extraname
      ,v4.value as additionalname
  from entity e
  left join values v1 on(e.id = v1.entity and v1.attributes = 1)
  left join values v2 on(e.id = v2.entity and v2.attributes = 2)
  left join values v3 on(e.id = v3.entity and v3.attributes = 3)
  left join values v4 on(e.id = v4.entity and v4.attributes = 4)
 where e.id = ?

или

select e.id
      ,max(case when v.attributes = 1 then value) as firstname
      ,max(case when v.attributes = 2 then value) as lastname
      ,max(case when v.attributes = 3 then value) as extraname
      ,max(case when v.attributes = 4 then value) as additionalname
  from entity e
  left join values v on(e.id = v.entity)
 where v.attributes in(1,2,3,4)
   and e.id = ?
 group by e.id;

Вы также можете использовать GROUP_CONCAT , чтобы вернуть значения в списке через запятую в одном столбце.

select e.id
      ,group_concat(v.value)
  from entity e
  left join values v on(e.id = v.entity)
 group 
    by e.id;

О, а values - зарезервированное слово.Не используйте его в качестве имени таблицы.

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

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

Я не потворствую выбору *, поэтому замените ваши столбцы.Значения могут быть зарезервированным ключевым словом

   select * 
   from values v

   left join attributes a
     on a.id = v.attributes

   left join entity e
     on e.id = v.entity

   where 1=1

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