mysql:如何使重复字段只出现一次?

时间:2014-01-27 09:47:30

标签: mysql sql select

我有sql创建和插入脚本:

CREATE TABLE NINJA_TYPE (
   NINJA_TYPE_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
   DESCRIPTION varchar(30) NOT NULL,
   PRIMARY KEY (NINJA_TYPE_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO NINJA_TYPE VALUES (1, 'Genin');
INSERT INTO NINJA_TYPE VALUES (2, 'Chunin');
INSERT INTO NINJA_TYPE VALUES (3, 'Jounin');
INSERT INTO NINJA_TYPE VALUES (4, 'Kage');

CREATE TABLE NINJA (
   NINJA_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
   NINJA_TYPE_ID int(10) unsigned NOT NULL,
   NAME varchar(30) NOT NULL,
   PRIMARY KEY (NINJA_ID),
   KEY FK_NINJA_TYPE (NINJA_TYPE_ID),
   CONSTRAINT FK_NINJA_TYPE FOREIGN KEY (NINJA_TYPE_ID) REFERENCES NINJA_TYPE (NINJA_TYPE_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO NINJA VALUES (1, 1, 'Fransie');
INSERT INTO NINJA VALUES (2, 1, 'Mary Grace');
INSERT INTO NINJA VALUES (3, 1, 'Hannah');
INSERT INTO NINJA VALUES (4, 1, 'Chinita');
INSERT INTO NINJA VALUES (5, 2, 'Nookie');
INSERT INTO NINJA VALUES (6, 2, 'Ruth');
INSERT INTO NINJA VALUES (7, 2, 'Rose');
INSERT INTO NINJA VALUES (8, 2, 'Irish');
INSERT INTO NINJA VALUES (9, 3, 'Tokmol');
INSERT INTO NINJA VALUES (10, 3, 'JG');
INSERT INTO NINJA VALUES (11, 3, 'JM');
INSERT INTO NINJA VALUES (12, 3, 'Jose');
INSERT INTO NINJA VALUES (13, 4, 'Tom');
INSERT INTO NINJA VALUES (14, 4, 'Johan');
INSERT INTO NINJA VALUES (15, 4, 'Christian');
INSERT INTO NINJA VALUES (16, 4, 'Lemuel');

我有sql select:

SELECT DISTINCT NAME, DESCRIPTION FROM NINJA N 
INNER JOIN NINJA_TYPE NT ON N.NINJA_TYPE_ID = NT.NINJA_TYPE_ID ;

结果:

+------------+-------------+
| NAME       | DESCRIPTION |
+------------+-------------+
| Fransie    | Genin       |
| Mary Grace | Genin       |
| Hannah     | Genin       |
| Chinita    | Genin       |
| Nookie     | Chunin      |
| Ruth       | Chunin      |
| Rose       | Chunin      |
| Irish      | Chunin      |
| Tokmol     | Jounin      |
| JG         | Jounin      |
| JM         | Jounin      |
| Jose       | Jounin      |
| Tom        | Kage        |
| Johan      | Kage        |
| Christian  | Kage        |
| Lemuel     | Kage        |
+------------+-------------+

我也尝试过分组:

SELECT DISTINCT NAME, DESCRIPTION FROM NINJA N 
INNER JOIN NINJA_TYPE NT ON N.NINJA_TYPE_ID = NT.NINJA_TYPE_ID GROUP BY DESCRIPTION;

结果:

+---------+-------------+
| NAME    | DESCRIPTION |
+---------+-------------+
| Nookie  | Chunin      |
| Fransie | Genin       |
| Tokmol  | Jounin      |
| Tom     | Kage        |
+---------+-------------+

我想要发生的是:

+------------+-------------+
| NAME       | DESCRIPTION |
+------------+-------------+
| Fransie    | Genin       |
| Mary Grace |             |
| Hannah     |             |
| Chinita    |             |
| Nookie     | Chunin      |
| Ruth       |             |
| Rose       |             |
| Irish      |             |
| Tokmol     | Jounin      |
| JG         |             |
| JM         |             |
| Jose       |             |
| Tom        | Kage        |
| Johan      |             |
| Christian  |             |
| Lemuel     |             |
+------------+-------------+

请不要问我为什么这样做。我有理由。我只是想知道如何处理它。请帮忙。

PS:我今天可能无法回答一些探究性问题,因为我必须去某个地方并明天回来。请随时给出答案,评论和建议。

感谢。

3 个答案:

答案 0 :(得分:2)

所以就这样做:

SELECT
  dist.name,
  IF(grouped.description IS NULL, '', grouped.description) AS description
FROM
(SELECT 
  DISTINCT NAME, 
  DESCRIPTION 
FROM 
  NINJA AS N 
    INNER JOIN NINJA_TYPE AS NT 
      ON N.NINJA_TYPE_ID = NT.NINJA_TYPE_ID) AS dist
LEFT JOIN
(SELECT 
   DISTINCT NAME, 
   DESCRIPTION 
 FROM 
   NINJA AS N 
     INNER JOIN NINJA_TYPE AS NT 
       ON N.NINJA_TYPE_ID = NT.NINJA_TYPE_ID 
 GROUP BY 
   DESCRIPTION) AS grouped
ON 
  dist.name=grouped.name

- 你会看到结果expected。请注意,对于使用应用程序后处理的格式化目的,更好的想法。

答案 1 :(得分:1)

虽然我完全赞同Mihai,但可以也做这样的事情......

SELECT * FROM users;
+----+----------+-----------+
| id | name     | surname   |
+----+----------+-----------+
|  1 | John     | Lennon    |
|  2 | Paul     | McCartney |
|  3 | George   | Harrison  |
|  4 | Ringo    | Starr     |
|  5 | Yoko Ono | Lennon    |
|  6 | Linda    | McCartney |
|  7 | Olivia   | Harrison  |
|  8 | Barbara  | Bach      |
|  9 | Stella   | McCartney |
+----+----------+-----------+

SELECT u.name
     , IF(u.surname=@last,'',@last:=u.surname) surname
  FROM users u, (SELECT @last='')x
 ORDER 
    BY u.surname;
+----------+-----------+
| name     | surname   |
+----------+-----------+
| Barbara  | Bach      |
| George   | Harrison  |
| Olivia   |           |
| John     | Lennon    |
| Yoko Ono |           |
| Paul     | McCartney |
| Linda    |           |
| Stella   |           |
| Ringo    | Starr     |
+----------+-----------+

答案 2 :(得分:1)

这个简单的怎么样?

SELECT
  nt.DESCRIPTION, GROUP_CONCAT(n.name) names
FROM
  NINJA_TYPE nt
JOIN
  NINJA n
    ON n.NINJA_TYPE_ID = nt.NINJA_TYPE_ID
GROUP BY
  nt.NINJA_TYPE_ID;

+-------------+-----------------------------------+
| DESCRIPTION | names                             |
+-------------+-----------------------------------+
| Genin       | Fransie,Mary Grace,Hannah,Chinita |
| Chunin      | Nookie,Ruth,Rose,Irish            |
| Jounin      | Tokmol,JG,JM,Jose                 |
| Kage        | Tom,Johan,Christian,Lemuel        |
+-------------+-----------------------------------+