MySQL: Как считать непустые поля в строке, а затем считать одинаковые значения? - PullRequest
4 голосов
/ 10 февраля 2011

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

name  |  widget1  |  widget2 | widget3 
------+-----------+----------+----------
Joe   |   blue    |   red    |          
Jane  |   green   |          |          
Bob   |   red     |   red    |  green
Susy  |   green   |  green   |   

Что я хотел бы сделать, это подсчитать общее количество виджетов (у Джо 2 виджета, у Джейн 1 и т. Д.), А также подсчитатьколичество похожих виджетов (у Боба есть 3 виджета - 2 красных и 1 зеленый, у Сьюзи 2 виджета - 2 зеленых и т. д.)

Вот мой код для подсчета общего количества виджетов:

SELECT ( 
         SUM( IF(widget1 <> "", 1, 0) ) +
         SUM( IF(widget2 <> "", 1, 0) ) +
         SUM( IF(widget3 <> "", 1, 0) )
       ) AS totalWidgets FROM table

Который работает нормально.Но есть ли лучший способ сделать это?Кроме того, чтобы подсчитать количество похожих значений, я уверен, что могу сделать что-то похожее, но просто проверить, равны ли значения ... но это может стать довольно длинным и запутанным.

Есть ли более прямой подход?

1 Ответ

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

Не тестировал, но он должен работать

select name, count(1), SUM(widget = 'red') reds, SUM(widget = 'green') greens, SUM(widget = 'blue') blues
from
  (
    (SELECT name, widget1 widget FROM table)
   UNION
    (SELECT name, widget2 widget FROM table)
   UNION
    (SELECT name, widget3 widget FROM table)
  )q
WHERE widget <> ''
group by name;

Все в одной строке

select name, count(1), SUM(widget = 'red') reds, SUM(widget = 'green') greens, SUM(widget = 'blue') blues from ((SELECT name, widget1 widget FROM table) UNION (SELECT name, widget2 widget FROM table) UNION (SELECT name, widget3 widget FROM table))q WHERE widget <> '' group by name;

q - это наша нормализованная "таблица" (не совсем таблица, новроде как один).

Посмотрите нашу нормализованную таблицу следующим образом

select * from ((SELECT name, widget1 widget FROM table) UNION (SELECT name, widget2 widget FROM table) UNION (SELECT name, widget3 widget FROM table))q;

Не уверен, как вы это называете, я думаю, что это подзапрос.(Я использовал MySQL в течение многих лет, и я все еще не знаю собственных имен)

...