【问题标题】:mysql union and group by similar fieldsmysql union 和 group by 类似字段
【发布时间】:2012-06-19 15:01:06
【问题描述】:

这是我的查询(我用通用的表名替换了表名)。我正在尝试对两个不同的查询进行联合,以便按日期对它们进行分组,以便日期相似的结果显示为一行。

我在尝试执行时收到“每个派生表必须有自己的别名”错误。我打错了什么?

我对此进行了研究,但找不到答案。每个选定的字段都有一个别名?还是第一个 SELECT 的问题?

SELECT SUM(val), id, dat, title FROM (

                      SELECT table1.product_id as id, SUM(table1.qty) as val, DATE_FORMAT(table1.created, '%Y-%m-1') as dat, table2.title as title 
                      FROM table1
                      LEFT JOIN table3 ON table1.event_id = table3.id
                      LEFT JOIN table2 ON table1.product_id = table2.id
                      WHERE table1.user_id = $user_id AND table3.active != 2 AND table3.temp = 0 AND table2.active != 2

                      GROUP BY dat

                      UNION ALL

                      SELECT table4.product_id as id, SUM(table4.qty) as val, DATE_FORMAT(table4.created, '%Y-%m-1') as dat, table2.title as title 
                      FROM table4
                      LEFT JOIN table5 ON table4.festival_id = table5.id
                      LEFT JOIN table2 ON table4.product_id = table2.id
                      WHERE table4.user_id = $user_id AND table5.active != 2 AND table2.active != 2

                      GROUP BY dat

                      )
                      GROUP BY id
                      ORDER BY dat ASC

这是我正在尝试做的事情:

我原来的结果:

Array
(
[0] => stdClass Object
    (
        [id] => 1
        [val] => 1
        [dat] => 2012-05-1
        [title] => Test Product
    )

[1] => stdClass Object
    (
        [id] => 1
        [val] => 8
        [dat] => 2012-06-1
        [title] => Test Product
    )

[2] => stdClass Object
    (
        [id] => 2
        [val] => 4
        [dat] => 2012-06-1
        [title] => Test Product 2
    )

[3] => stdClass Object
    (
        [id] => 3
        [val] => 6
        [dat] => 2012-06-1
        [title] => Test Product 3
    )

[4] => stdClass Object
    (
        [id] => 1
        [val] => 10
        [dat] => 2012-05-1
        [title] => Test Product
    )

[5] => stdClass Object
    (
        [id] => 1
        [val] => 8
        [dat] => 2012-06-1
        [title] => Test Product
    )

[6] => stdClass Object
    (
        [id] => 2
        [val] => 3
        [dat] => 2012-06-1
        [title] => Test Product 2
    )

[7] => stdClass Object
    (
        [id] => 3
        [val] => 3
        [dat] => 2012-06-1
        [title] => Test Product 3
    )

)

因此,如果他们有相似的日期和 ID,我需要这些只是一个结果。像这样:

    Array
(
[0] => stdClass Object
    (
        [id] => 1
        [val] => 11
        [dat] => 2012-05-1
        [title] => Test Product
    )

[1] => stdClass Object
    (
        [id] => 1
        [val] => 8
        [dat] => 2012-06-1
        [title] => Test Product
    )

[2] => stdClass Object
    (
        [id] => 2
        [val] => 7
        [dat] => 2012-06-1
        [title] => Test Product 2
    )

[3] => stdClass Object
    (
        [id] => 3
        [val] => 9
        [dat] => 2012-06-1
        [title] => Test Product 3
    )

)

如果您需要其他任何东西,请告诉我。提前致谢。

【问题讨论】:

    标签: mysql group-by union alias


    【解决方案1】:

    试试这个:

    SELECT SUM(val), id, dat, title FROM (
    
                      SELECT table1.product_id as id, SUM(table1.qty) as val, DATE_FORMAT(table1.created, '%Y-%m-1') as dat, table2.title as title 
                      FROM table1
                      LEFT JOIN table3 ON table1.event_id = table3.id
                      LEFT JOIN table2 ON table1.product_id = table2.id
                      WHERE table1.user_id = $user_id AND table3.active != 2 AND table3.temp = 0 AND table2.active != 2
    
                      GROUP BY dat
    
                      UNION ALL
    
                      SELECT table4.product_id as id, SUM(table4.qty) as val, DATE_FORMAT(table4.created, '%Y-%m-1') as dat, table2.title as title 
                      FROM table4
                      LEFT JOIN table5 ON table4.festival_id = table5.id
                      LEFT JOIN table2 ON table4.product_id = table2.id
                      WHERE table4.user_id = $user_id AND table5.active != 2 AND table2.active != 2
    
                      GROUP BY dat
    
                      ) AS t
                      GROUP BY id, dat
                      ORDER BY dat ASC
    

    正如错误所暗示的,每个视图/派生表都必须有一个别名..

    编辑:这将为您提供具有不同 id/dat 对的记录。看来这就是你所追求的。

    【讨论】:

    • 我在其他示例中看到了 AS t,它有什么作用?
    • 它是您为查询中的每个表指定的别名(意思是名称)。对于正确的表,它有自己的名称,但对于派生表,它没有名称。没有名称就不可能指定表。这是 MySQL 的标准行为。在 SQLite 中并非如此。有关更多信息,请参阅此链接。stackoverflow.com/questions/9442119/…
    • 现在没有按照上面的要求将结果组合在一起。我将如何重组给定的查询以按要求显示?
    • @K_G 我不知道你到底想要什么。如果您不想在两个查询的联合中出现重复,请使用union 而不是union all。此外,您还可以在t.dat 上进行分组,而不是进行两个单独的组,但是它的行为会有所不同。要知道您想要哪种行为,只有您自己知道。 MySQL group by 有点难以理解。给我们一些你期望的测试数据和输出将帮助我们更好地给出正确的查询
    • 我得到的和我想要的已经在原始问题中
    猜你喜欢
    • 2012-09-11
    • 2017-06-09
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多