【问题标题】:mysql GROUP CONCAT not returning valuesmysql GROUP CONCAT不返回值
【发布时间】:2021-03-21 23:46:40
【问题描述】:

这是我的查询

SELECT 
    SUM(o.order_disc + o.order_disc_vat) AS manualsale
FROM
    orders o
WHERE
    o.order_flag IN (0 , 2, 3)
        AND o.order_status = '1'
        AND (o.assign_sale_id IN (SELECT GROUP_CONCAT(CAST(id AS SIGNED)) AS ids FROM users WHERE team_id = 92))
        AND DATE(o.payment_on) = DATE(NOW())

当我在终端中运行此查询时,上述查询返回 null

当我在下面使用子查询时,它会返回数据

SELECT GROUP_CONCAT(CAST(id AS SIGNED)) AS ids FROM users WHERE team_id = 92)

以上查询返回

'106,124,142,179'

当我像下面这样运行我的第一个查询时

SELECT 
    SUM(o.order_disc + o.order_disc_vat) AS manualsale
FROM
    orders o
WHERE
    o.order_flag IN (0 , 2, 3)
        AND o.order_status = '1'
        AND (o.assign_sale_id IN (106,124,142,179))
        AND DATE(o.payment_on) = DATE(NOW())

它返回我的价值。 为什么它不适用于子查询请帮助

【问题讨论】:

  • o.assign_sale_id 是什么数据类型
  • o. assign_sale_id 是 int 数据类型

标签: mysql sql subquery aggregate-functions where-clause


【解决方案1】:

这不符合你的要求:

AND (o.assign_sale_id IN (SELECT GROUP_CONCAT(CAST(id AS SIGNED)) AS ids FROM users WHERE team_id = 92))

这会将单个值与逗号分隔的值列表进行比较,因此它永远不会匹配(除非给定团队的用户中只有一行)。

可以将其表述为:

AND assign_sale_id IN (SELECT id FROM users WHERE team_id = 92)

但这可能会更有效地表达为exists

AND EXISTS(SELECT 1 FROM users u WHERE u.team_id = 92 AND u.id = o.assign_sale_id)

旁注:我还建议重写此条件:

AND DATE(o.payment_on) = DATE(NOW())

到以下,可以利用索引:

AND o.payment_on >= current_date AND o.payment_on < current_date + interval 1 day

【讨论】:

  • 谢谢@GMB assign_sale_id IN (SELECT id FROM users WHERE team_id = 92) 我用过这个我不知道我怎么能犯这个愚蠢的错误,谢谢你的帮助队友
猜你喜欢
  • 2014-11-22
  • 2012-06-29
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
相关资源
最近更新 更多