【问题标题】:Query for retrieving result in Normal forms [closed]以普通形式检索结果的查询[关闭]
【发布时间】:2012-07-03 17:45:06
【问题描述】:

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

前:

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

【问题讨论】:

  • 欢迎来到 Stack Overflow。请查看FAQ,了解如何在此处提问。就目前而言,这个问题缺乏成为一个好问题所需的大部分信息。在与 SQL 相关的问题中,指定表名和列名(最好也包含类型信息)有很大帮助。在这个问题中,您确实需要指定源数据的结构;没有它,我们只能猜测您要处理的内容。包括样本输出的最小数据也有帮助。 (在这里声称3天的艰辛是不好的!)
  • 这里的人确实想帮助你,但你的问题严重缺乏。你说你花了三天时间来调试你的问题。如果您希望人们花时间帮助您解决问题,那么花 15 分钟开发一个测试用例、一个示例表和数据以及您尝试过的查询文本怎么样。只是说...codinghorror.com/blog/2012/03/rubber-duck-problem-solving.html

标签: mysql sql database


【解决方案1】:

根据您给我们的内容,只是所需结果集的一个样本,我几乎无法抗拒建议:

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

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

【讨论】:

  • +1 表示超出职责范围的努力!
  • @Jonathon,你认为我应该在第一次查询后停止吗?感谢您对 OP 问题的评论。上古智慧xkcd.com/979
  • 总的来说,我认为两部分的答案比第一部分要好。第一个答案很好,但有点太聪明了,不能成为唯一的答案(但有道理)。但是必须对问题中的最少信息进行解释是一项适度的艰苦工作,而且你做得很好。至于古人的智慧:去过那里,做到了! :D
猜你喜欢
  • 2011-07-15
  • 2020-02-27
  • 2015-11-13
  • 2018-03-02
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 2012-11-27
相关资源
最近更新 更多