我有以下数据:
+-----+-----+
| ID1 | ID2 |
+-----+-----+
| 100 | AAA |
| 100 | BBB |
| 200 | AAA |
| 200 | BBB |
| 300 | AAA |
| 300 | BBB |
| 300 | CCC |
| 400 | BBB |
+-----+-----+
我需要以某种方式对上表中的行进行分组并得到:
+-----+-----+ +-----+-----+ +-----+-----+
| ID1 | ID2 | | ID1 | ID2 | | ID1 | ID2 |
+-----+-----+ +-----+-----+ +-----+-----+
| 100 | AAA | OR | 100 | BBB | OR | 400 | BBB | IS ACCEPTABLE
| 200 | BBB | | 200 | AAA | | 300 | CCC |
| 300 | CCC | | 300 | CCC | | 200 | AAA |
+-----+-----+ +-----+-----+ +-----+-----+
上面给出的上述分组结果集中的哪一个并不重要,只要没有重复出现ID1和ID2值。即以下结果集(通过ID1或ID2简单分组获得)将是“错误的”:
+-----+-----+ +-----+-----+
| ID1 | ID2 | | ID1 | ID2 |
+-----+-----+ +-----+-----+
| 100 | AAA | AND | 100 | AAA | ARE BOTH "WRONG"
| 200 | AAA | | 100 | BBB |
| 300 | AAA | | 300 | CCC |
| 400 | BBB | +-----+-----+
+-----+-----+
不要忘记一个重要的事实。我一定会使用MySQL函数。
答案 0 :(得分:0)
这是一个想法 - 但我不确定(我的)sql是组合问题的最佳工具......
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id1 INT NOT NULL,id2 CHAR(3) NOT NULL,PRIMARY KEY(id1,id2));
INSERT INTO my_table VALUES
(100 ,'AAA'),
(100 ,'BBB'),
(200 ,'AAA'),
(200 ,'BBB'),
(300 ,'AAA'),
(300 ,'BBB'),
(300 ,'CCC'),
(400 ,'BBB');
SELECT *
FROM my_table x
JOIN my_table y
ON y.id1 > x.id1
AND y.id2 <> x.id2
JOIN my_table z
ON z.id1 > y.id1
AND z.id2 <> x.id2
AND z.id2 <> y.id2
ORDER
BY RAND() LIMIT 1;
+-----+-----+-----+-----+-----+-----+
| id1 | id2 | id1 | id2 | id1 | id2 |
+-----+-----+-----+-----+-----+-----+
| 200 | AAA | 300 | CCC | 400 | BBB |
+-----+-----+-----+-----+-----+-----+
顺便说一句,如果重要的话,可以按照以下方式重新格式化:
SELECT a.*
FROM my_table a
JOIN
( SELECT x.id1 x_id1
, x.id2 x_id2
, y.id1 y_id1
, y.id2 y_id2
, z.id1 z_id1
, z.id2 z_id2
FROM my_table x
JOIN my_table y
ON y.id1 > x.id1
AND y.id2 <> x.id2
JOIN my_table z
ON z.id1 > y.id1
AND z.id2 <> x.id2
AND z.id2 <> y.id2
ORDER
BY RAND() LIMIT 1
) b
ON (a.id1,a.id2) IN((x_id1,x_id2),(y_id1,y_id2),(z_id1,z_id2));
(延续:)
+-----+-----+
| id1 | id2 |
+-----+-----+
| 100 | AAA |
| 200 | BBB |
| 300 | CCC |
+-----+-----+