[PHP-users 19651]Re: GROUP BY節、HAVING節 について

ayataro @ dd.mbn.or.jp ayataro @ dd.mbn.or.jp
2004年 1月 3日 (土) 01:20:17 JST


 こんにちは。向後と申します。

On 2004/01/02, at 22:13, zai wrote:
> 1.code1〜5は、VARCHAR型ですが、"c123"以上、"d998"以下と言う扱い方をし
> たい。
> 2.それが出来れば、"c555"や"d122"などは、1.の範囲に入るので、code1〜
> code5の5つの項目のなかの、どの項目にあっても、カウントを1する。
>
>  具体的には、
>   レコードAは、code2に"c555"、code4に"d122"、code5に"x333"、
>   レコードBは、code1に"c222"、code3に"a111"、
>   レコードCは、code2に"c555"、code5に"c999"
> と、言うような場合
>
>   レコードAから2個、Bから1個、Cから2個の合計カウント5を求めたいの
> です。

 そもそも、PHPのMLで group by や having の使い方を聞くのは、ちょっと違うかと思うのですが。
 それはさておき、基本的にsqlのcountは項目を数えるのではなく、レコード数を数えるためのものでは?
 なので、正攻法では無理だと思います。

 無理矢理sqlでやろうとすると、私は以下のsql位しかおもいつきませんでした。
 MySQLの環境が今手元にないので、PostgreSQLで検証。
 あと、項目1、項目2の内容が不明なのでzaiさんの期待する結果なのかもいまいち怪しいです。まぁ、なにかの参考にでもなれば、ということで。

*前準備*
create table test1 (k1 varchar(4),k2 varchar(4),code1 varchar(4),code2 
varchar(4),code3 varchar(4),code4 varchar(4),code5 varchar(4));
insert into test1(code2,code4,code5) values('c555','d122','x33');
insert into test1(code1,code3) values ('c222','a111');
insert into test1(code2,code5) values ('c555','c999');

*本文*
select * from (
select k1,k2,code1 as code from test1
union all
select k1,k2,code2 as code from test1
union all
select k1,k2,code3 as code from test1
union all
select k1,k2,code4 as code from test1
union all
select k1,k2,code5 as code from test1
) as a
where code between 'c555' and 'd998';

*結果*
  k1 | k2 | code
----+----+------
   |       | c555
       |       | c555
       |       | d122
       |       | c999
(4 rows)

#あと、レコードBの'c222' 'a111'は共に between 'c555' and 
'd998'に含まれないので、合計カウントは5じゃなくて4ですよね?



PHP-users メーリングリストの案内