Упорядочить по результату выражения для каждого результата / Пользовательская сортировка метаданных - PullRequest
0 голосов
/ 27 февраля 2012

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

Проблема в том, что я хочу отсортировать по этим метаданным. Я могу легко сгенерировать таблицу, в которой метаданные выглядят как просто еще один столбец, но я хочу отсортировать по ним. Итак, чтобы проиллюстрировать, что у меня есть:

Скажите, у меня есть следующие таблицы:

Items Table:
id | color
----------
0  | red
1  | pink
2  | orange

MetaData Table
itemId |     title     |     data
-----------------------------------------
   0        shape           round
   1   |    shape      |    square
   0   |    sound      |    LOUD!

Я могу легко написать SQL и код для генерации чего-то подобного следующему из этих таблиц:

id  |    color   |   shape    |   sound
--------------------------------------------
0   |    red     |   round    |   LOUD!
1   |    pink    |   square   |            
2   |   orange   |            |   

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

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

Возможно ли это сделать в SQL (я использую mysql, но что-то более общее было бы лучше, если бы я это изменил)? Является ли мой макет таблицы просто непрактичным для этого / я должен сделать это по-другому (я бы предпочел не менять мой макет таблицы).

Спасибо!

Ответы [ 3 ]

0 голосов
/ 27 февраля 2012

Что ж, если вам удалось сделать этот свод в mysql, то есть добавить shape в качестве столбца в запросе, то вы используете оператор CASE или IF.

единственное, что вам нужно сделать, это назначить им псевдоним и затем упорядочить по этому псевдониму.

Вот и все:)

0 голосов
/ 16 марта 2012

Есть проблема с решением Стива Касса.В любом случае, после небольшого прочтения сводных таблиц и некоторых экспериментов, вот мое рабочее решение для всех, кто интересуется:

SELECT DISTINCT items.id, items.color, 
GROUP_CONCAT(CASE WHEN metaData.title = ? THEN metaData.data ELSE NULL END) AS metaDataSortItem FROM items 
LEFT OUTER JOIN metaData ON items.id=metaData.itemId 
GROUP BY items.id
ORDER BY metaDataSortItem ASC

Кажется, все работает так, как я ожидал.

0 голосов
/ 27 февраля 2012

Вы можете поместить пустые значения внизу примерно так:

select
  Items.id,
  Items.color,
  max(case when title = 'shape' then data else null end) as shape,
  max(case when title = 'sound' then data else null end) as sound
from Items left outer join MetaData
on Items.id = MetaData.itemId
group by Items.id, Items.color
order by
  case when shape is not null then 0 else 1 end,
  shape
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...