【问题标题】:Problem with Concat results searching in MYSQLMYSQL中Concat结果搜索的问题
【发布时间】:2020-10-12 14:54:54
【问题描述】:

您好,这是我试图获得结果的查询,但我如何才能在该列中搜索 concat 结果?

SELECT 
     ( SELECT GROUP_CONCAT(tp.login) 
         FROM tp 
        WHERE tp.user_id = user_extra.user_id
     ) as login
     , users.email as email
     , user_extra.fname as name 
  FROM user_extra 
  LEFT 
  JOIN users 
    ON users.id = user_extra.user_id 
 WHERE users.email like "%example@example.com%" 
    OR user_extra.fname like "%test%" 
    OR tp.login like "%461988%"

【问题讨论】:

  • 您是否有机会编辑您的帖子以使 SQL 分布在多行上,首席?这样读起来有点难。。

标签: mysql sql subquery left-join where-clause


【解决方案1】:

您不能在同一范围内引用select 子句中定义的别名(order by 子句除外)。在 MySQL 的最新版本(8.0.14 或更高版本)中,您可以为此使用 lateral

SELECT tp.login, u.email as email, ue.fname as name 
FROM user_extra ue
LEFT JOIN users u ON u.id = ue.user_id 
LEFT JOIN LATERAL (
    SELECT GROUP_CONCAT(tp.login) login
    FROM tp 
    WHERE tp.user_id = ue.user_id
) tp ON 1
WHERE 
    u.email like '%example@example.com%'
    OR ue.fname like '%test%'
    OR tp.login like '%461988%'

在早期版本中,您可以JOIN,或使用子查询:

SELECT *
FROM (
    SELECT 
        (SELECT GROUP_CONCAT(tp.login) login FROM tp WHERE tp.user_id = ue.user_id) login, 
        u.email as email, 
        ue.fname as name 
    FROM user_extra ue
    LEFT JOIN users u ON u.id = ue.user_id 
) t
WHERE 
    email like '%sradesign.net@gmail.com%'
    OR fname like '%test%'
    OR login like '%461988%'

【讨论】:

  • 我使用 MySQL 7,所以有机会在 MySQL 低于 8 的情况下以某种方式实现这一目标吗?
  • @AliMahmoudi:MySQL 7 不是一个东西,我猜你的意思是 MySQL 5.7。查看我的更新。
  • 由于某种原因,它需要很长时间才能加载它有点永无止境的查询现在已经花费了 470 多秒并继续。您知道可能是什么问题吗?
  • @AliMahmoudi:我不知道。我用你的代码解决了这个问题,并确定了一个有效的 SQL 查询,所以我认为你的问题在这里得到了回答。如果您有性能问题,那么您应该提出一个新问题,提供相关信息,例如:您所涉及的每个表的结构、查询的执行计划等。跨度>
  • 你说得对,我认为性能问题仅仅是因为整个表在内部选择中被调用,它有 200K 记录,然后从父选择中过滤掉“where”部分,这就是为什么是巨大的加载。所以你回答了我的问题,但毕竟,我需要找到一个更好的解决方案,因为这种方式存在缺陷并且存在巨大的性能问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 2014-11-02
  • 1970-01-01
相关资源
最近更新 更多