mysqlの関数IF,GROUUP_CONCATの使用


詳細
mysqlで最近使った関数を記録します
1、IF(expr 1、expr 2、expr 3)は、私たちがよく使う3つの演算と似ています.expr 1は式であり、TRUEの場合、expr 2を返さないとexpr 3となる
次のデータがあります.
INSERT INTO a(id,a,b) VALUES ('1', '1', '1');
INSERT INTO a(id,a,b) VALUES ('2', '1', '0');
INSERT INTO a(id,a,b) VALUES ('3', '1', '0');
INSERT INTO a(id,a,b) VALUES ('4', '1', '0');
INSERT INTO a(id,a,b) VALUES ('5', '0', '0');
INSERT INTO a(id,a,b) VALUES ('6', '0', '1');

たとえば、aの戻り状態をクエリーするには、1はYes、0はNoを表します.
SELECT IF(a=1,' ',' ') as flag FROM a

2列のデータを比較する必要がある場合があります.例えば、a、bの値を同時に比較するには、(1,1)、(1,0)、(0,1)、(0,0)で統計します.
SELECT
SUM(IF (a=1 AND b= 1, 1, 0)) as flag1,
SUM(IF (a=1 AND b= 0, 1, 0)) as flag2,
SUM(IF (a=0 AND b= 1, 1, 0)) as flag3,
SUM(IF (a=0 AND b= 0, 1, 0)) as flag4
FROM a
1	3	1	1

これでタイプ別の統計が完了しました.
2、GROUP_CONCATは、データのセットのnon-NULLを直列の文字列として返し、groupと一緒によく使用します.簡単に言えば、次のようなデータがあります.
INSERT INTO `table2(id, a)` VALUES ('1', '0');
INSERT INTO `table2(id, a)` VALUES ('1', '1');
INSERT INTO `table2(id, a)` VALUES ('2', '0');
INSERT INTO `table2(id, a)` VALUES ('2', '3');
INSERT INTO `table2(id, a)` VALUES ('1', '4');

ここに戻る必要がある
id     a
-----------
1	|0,1,4
2	|0,3

この関数で
SELECT id, GROUP_CONCAT(a)
FROM table2
GROUP BY id;

GROUP_を見てみましょうCONCAT構文:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

この関数のdocを参照:DISTINCTでリダイレクトできます.ORDER BYソート、SEPARATORで区切り記号を指定します(デフォルトは「,」)次のデータがあります.
INSERT INTO `table2(id, a)` VALUES ('1', '0');
INSERT INTO `table2(id, a)` VALUES ('1', '1');
INSERT INTO `table2(id, a)` VALUES ('2', '0');
INSERT INTO `table2(id, a)` VALUES ('2', '3');
INSERT INTO `table2(id, a)` VALUES ('1', '4');
INSERT INTO `table2(id, a)` VALUES ('2', '3');

a降順で繰り返してはいけないことを示す必要があります.
SELECT id, GROUP_CONCAT(DISTINCT a ORDER BY a DESC SEPARATOR '-')
FROM table2
GROUP BY id;

結果を出力します.
id	a
-----------------------
1	4-1-0
2	3-0

この関数があれば、いくつかのビジネス上のことを処理することができます.例えば、2つのテーブルのうち1つのtable 3のidのペアが他のテーブルtable 4のridに関連しています.ipadとmacの具体的なバージョンを統計すると、sqlで直接実現することができます.
-- table3(id,  name)
INSERT INTO `table3(id, name)` VALUES ('1', 'ipad');
INSERT INTO `table3(id, name)` VALUES ('2', 'mac');

-- table4(id,  rid,  name)
INSERT INTO `table4(id, rid, name)` VALUES ('1', '1', 'ipad1');
INSERT INTO `table4(id, rid, name)` VALUES ('2', '1', 'ipad2');
INSERT INTO `table4(id, rid, name)` VALUES ('3', '1', 'ipad3');
INSERT INTO `table4(id, rid, name)` VALUES ('4', '2', 'pro');
INSERT INTO `table4(id, rid, name)` VALUES ('5', '2', 'air');
INSERT INTO `table4(id, rid, name)` VALUES ('6', '2', 'mini');
SELECT 
	a.id,
	a.name,
	GROUP_CONCAT(b.name) as version
FROM table3 a JOIN table4 b ON a.id = b.rid
GROUP BY a.id; 

---
id	name	version
1	ipad	ipad1,ipad2,ipad3
2	mac	pro,air,mini

 
注意事項:
1、接続の長さはgroup_concat_max_lenパラメータ制限、すなわち、この戻り長さはすべて返されるわけではありませんが、デフォルトでは1024も長いです.もちろん、現在のconcatフィールドのタイプ制限とmax_allowed_packetの制限2、接続は、現在の接続のタイプに依存するバイナリおよび非バイナリstringを返します.512個を超えるとTEXTまたはBLOBに戻る可能性があります.接続がintまたは他の場合は、関数CAST(expr AS type)、CONVERT(expr,type)などを使用してCharに移行することが望ましい.CASTドキュメントを参照してください.
-- CAST
SELECT CAST(id as CHAR) FROM table4;
-- Convert
SELECT Convert(id, CHAR) FROM table4;
 
 
以下のblogを参考にして
http://blog.sina.com.cn/s/blog_4e808acf01009qna.html