-5

我怎样才能得到这样的结果?

前任:

id     |  name   |  locid
--------------------------
1      |  IND,UK |   1
       |  USA    |   2
       |  PAK    |   3
2      |  UAE    |   4
4

1 回答 1

3

有了你给我们的继续,只是所需结果集的一个样本,我几乎无法抗拒建议:

SELECT '1' AS `id`, 'IND,UK' AS `name`, '1' AS locid
UNION ALL SELECT '', 'USA', '2'
UNION ALL SELECT '', 'PAK', '3'
UNION ALL SELECT '2', 'UAE', '4'

好吧,事实证明我最终还是忍不住提出了建议。

但我很确定这并不能回答你提出的问题。

我只是在这里猜测您的表结构。但鉴于:

CREATE TABLE mytable (id INT, locid INT, `name` VARCHAR(3));
INSERT INTO mytable VALUES (1,1,'IND'),(1,1,'UK'),(1,2,'USA'),(1,3,'PAK'),(2,4,'UAE');

该语句将返回指定的结果集:

SELECT IF(u.id_break=1,u.id,'') AS id
     , u.name
     , u.locid
  FROM ( SELECT IF(t.id = @last_id,0,1) AS id_break
              , @last_id := t.id AS id
              , t.locid
              , t.name
           FROM ( SELECT s.id, s.locid, GROUP_CONCAT(s.name) AS `name`
                    FROM mytable s
                   GROUP BY s.id, s.locid
                   ORDER BY s.id, s.locid
                ) t
           JOIN (SELECT @last_id := NULL) i
          ORDER BY t.id, t.locid
       ) u

我只是在这里猜测标记列中的“缺失”值id并没有真正缺失,但它被抑制了,有点像报告中的控制中断。

我会注意到我提供的 SQL 语句不是规范模式,因为查询的结果集可以用作另一个查询的行集,“摆脱”每行上重复值的想法与关系模型。

通常,这种类型的操作(将重复值转换为“控制中断”或“标题”)通常在报表创建层处理,而不是在拉取结果集的 SQL 中处理。

如果我们不需要消除后续行中重复的 id 值,则查询要简单得多:

SELECT t.id
     , t.locid
     , t.name
  FROM ( SELECT s.id, s.locid, GROUP_CONCAT(s.name) AS `name`
           FROM mytable s
          GROUP BY s.id, s.locid
          ORDER BY s.id, s.locid
       ) t
 ORDER BY t.id, t.locid

我不确定这是否对您有帮助。就您的问题而言,您的问题太模糊了。

于 2012-07-03T18:15:57.377 回答