【问题标题】:Subquery select using UNION使用 UNION 选择子查询
【发布时间】:2012-11-09 15:20:27
【问题描述】:
CREATE TABLE newsarticles
    (katernenID int, Buitenland int, Economie int, Sport int, Cultuur int, Wetenschap int, Media int, userID int);

INSERT INTO newsarticles
    (katernenID, Buitenland, Economie, Sport, Cultuur, Wetenschap, Media, userID)
VALUES
    (1, 24, 5, 52, 3, 2, 3, 1),
    (3, 2, 0, 0, 1, 51, 66, 5),
    (4, 50, 2, 67, 41, 1, 54, 6),
    (5, 30, 1, 79, 0, 0, 12, 7),
    (6, 9, 26, 0, 100, 11, 0, 8),
    (7, 2, 14, 8, 1, 33, 98, 9),
    (8, 0, 1, 0, 1, 0, 0, 10);



SELECT
  userID,GROUP_CONCAT(amt ORDER BY amt DESC) AS four_highest
FROM
(
  SELECT userID, @rownum := @rownum + 1 AS rank, NAME, amt FROM (
    SELECT userID, Buitenland AS amt, 'Buitenland' AS NAME UNION
    SELECT userID, Economie, 'Economie'  UNION
    SELECT userID, Sport, 'Sport' UNION
    SELECT userID, Cultuur, 'Cultuur'  UNION
    SELECT userID, Wetenschap, 'Wetenschap'  UNION
    SELECT userID, Media, 'Media' 
         FROM( SELECT katernenID, Buitenland, Economie, Sport, Cultuur, Wetenschap, Media, userID FROM newsarticles  ) temp

  ) amounts, (SELECT @rownum := 0) r
) top4
GROUP BY userid

我想让 UNION 像上面的查询一样,但是 Union 不起作用。 UNION 立即需要 FROM 语句。 喜欢:

    SELECT userID, Wetenschap, 'Wetenschap'  
                 FROM( SELECT katernenID, Buitenland, Economie, Sport, Cultuur, Wetenschap, Media, userID FROM newsarticles  ) temp
                 UNION
    SELECT userID, Media, 'Media' 
         FROM( SELECT katernenID, Buitenland, Economie, Sport, Cultuur, Wetenschap, Media, userID FROM newsarticles  ) temp

但是我不能重复 FROM 语句,子查询中有太多的计算。有没有办法做到这一点,还是我错过了什么?

我想要一个具有 max(a_percentage,b_percentage,c_percentage),SecondMAX(a_percentage,b_percentage,c_percentage),ThirdMAX(a_percentage,b_percentage,c_percentage) 的新列

    SELECT id,a,b,c,a_percentage,b_percentage,c_percentage
    -- -------------------------max percentage
    GREATEST(axis_per, hdfc_per,icici_per,citi_per ) AS max_per,
    FROM (
      SELECT id,a,b,c,
      IFNULL(a*100/a+b+c+d,0) AS a_percentage,
      IFNULL(b*100/a+b+c+d,0) AS b_percentage,
      IFNULL(c*100/a+b+c+d,0) AS c_percentage
      FROM test
        WHERE TIME > '2012-01-01'
        GROUP BY id
      ) A

【问题讨论】:

  • 从你的结构和样本记录中,你想要的结果是什么?

标签: mysql subquery union correlated-subquery


【解决方案1】:

如果我理解正确,您应该可以只使用 FROM 中的表名,并为每一行的列设置别名,例如:

SELECT
  userID,GROUP_CONCAT(amt ORDER BY amt DESC) AS four_highest
FROM
(
  SELECT userID, @rownum := @rownum + 1 AS rank, NAME, amt FROM (
    SELECT userID, Buitenland AS amt, 'Buitenland' AS NAME FROM newsarticles NAME UNION
    SELECT userID, Economie, 'Economie'  FROM newsarticles UNION
    SELECT userID, Sport, 'Sport'  FROM newsarticles UNION
    SELECT userID, Cultuur, 'Cultuur'  FROM newsarticles UNION
    SELECT userID, Wetenschap, 'Wetenschap'  FROM newsarticles UNION
    SELECT userID, Media, 'Media' FROM newsarticles
) amounts, (SELECT @rownum := 0) r
) top4
GROUP BY userid

【讨论】:

  • 你是完全正确的,但我不能从这样的表中获取数据。此语句是虚拟的“SELECT katernenID, Buitenland, Economie, Sport, Cultuur, Wetenschap, Media, userID FROM newsarticles”。取而代之的是内部查询中的计算过多以及来自计算的一些新列。
  • 您能在问题中发布一个示例吗?
猜你喜欢
  • 2021-04-08
  • 2017-12-06
  • 1970-01-01
  • 2013-07-06
  • 2012-07-26
  • 2020-05-08
  • 1970-01-01
  • 2011-04-18
  • 2015-06-25
相关资源
最近更新 更多