2011-02-10 4 views
4

テーブルを正規化する方法はないので、私が得たもので作業する必要があることに注意してください。表では、行は(ジェーンは1、などがあり、ジョーは2ウィジェットを持っている)私はウィジェットの合計数をカウントされませんしたいのですがこれは何MySQL:行の空でないフィールドを数え、同じ値を数える方法は?

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

と同様であり、また、数を数えます正常に動作します

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

はここウィジェットの合計数をカウントするために私のコードです - 同様のウィジェットが(スージーは2 widgets- 2グリーンなどがあり、2赤と1つの緑のボブは3つのウィジェットを持っています)。しかし、これを行うよりよい方法はありますか?また、同様の値の数を数えるために、私はそれに似たようなことができると確信していますが、値が等しいかどうかを確認してください...しかし、かなり長く畳み込まれる可能性があります。

もっと直接的なアプローチはありますか?

答えて

2

はテストしていませんが、それは1行

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上のすべては、私たちの正規化された「表」である(ない本当にテーブルが、それはちょっと1のように見える)

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 * from ((SELECT name, widget1 widget FROM table) UNION (SELECT name, widget2 widget FROM table) UNION (SELECT name, widget3 widget FROM table))q; 

ないあなたがそれを呼んで確認してください私たちの正規化されたテーブルを参照してください、私はそれがサブクエリだと思います。 (私は何年もMySQLを使用していましたが、まだは適切な名前が分かりません)

+1

Brilliant!完璧に働いた。 HeeHaw! – TerryMatula

関連する問題