Эффективный SQL, чтобы объединить результаты или оставить клиентскому браузеру JavaScript? - PullRequest
1 голос
/ 05 февраля 2011

Мне было интересно, как наиболее эффективно объединить результаты в один результат.

Я хочу превратить

Num  Ani   Country
---- ----- -------
22   cows  Canada
20   pigs  Canada
40   cows  USA
34   pigs  USA

в:

cows  pigs  Country
----- ----- -------
22    20    Canada
40    34    USA

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

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

Ответы [ 2 ]

2 голосов
/ 05 февраля 2011

Операция, которую вы выполняете, называется «поворотом» - на информационной странице PIVOT есть немного больше деталей :

  SELECT MAX(CASE WHEN t.ani = 'cows' THEN t.num ELSE NULL END) AS cows,
         MAX(CASE WHEN t.ani = 'pigs' THEN t.num ELSE NULL END) AS pigs,
         t.country
    FROM YOUR_TABLE t
GROUP BY t.country
ORDER BY t.country
0 голосов
/ 05 февраля 2011

Должен быть эффективный способ использования двумерного массива на стороне клиента (php) для достижения поворота.Чтобы учесть опасения Кена Даунса по поводу проталкивания байтов, необработанные необработанные сводные данные потребляют меньше байтов, чем полностью материализованная двумерная сводная таблица, простой случай -

cows | pigs | sheep | goats | country
1      null   null    null    Canada
null   2      null    null    USA
null   null   3       null    Egypt
null   null   null    4       England

, что составляет всего 4 строки необработанных данныхкаждая состоит из 3 столбцов).

Выполнение этого в интерфейсе также решает проблему динамического поворота.Если число ваших столбцов сводных данных неизвестно, то вам потребуется процедура MySQL для создания динамического оператора sql шаблона «MAX (CASE ....)» для каждого столбца.

Существуют преимущества дляВыполнение этого на стороне клиента

  1. может быть выполнено (по крайней мере, рассматривается как альтернатива)
  2. может быть выполнено ранее, если экономия сетевого трафика значительна, несмотря на то, что требуется либо (1) поворотная конструкция php или (2) клиентский javascript
  3. не требует процедуры MySQL для динамического поворота
...