【问题标题】:How can I rewrite this complex SQL query to not use a subquery for MySQL Views?如何重写这个复杂的 SQL 查询以不使用 MySQL 视图的子查询?
【发布时间】:2009-10-13 18:05:27
【问题描述】:

无论出于何种原因,MySQL 都不支持视图中的子查询。在可预见的未来,我坚持使用 MySQL,我需要编写一个视图来将来自 EAV 样式表的数据聚合成更易读的格式。视图本身将充当基于 Ruby on Rails 的应用程序的模型(它是只读的,因此我可以安全地使用视图)。

如果我可以的话,我怎么能重写这个野兽来创建一个视图呢?我想如果必须的话,我可以创建一系列迷你视图,然后创建一个主视图(一个视图来统治它们,视情况而定),但我想知道还有另一种方法。

这是怪物;大量外连接是因为所有字段都是可选的,但我需要显示所有列:

select ls.subscriberid as id, l.name as list_name, 
  ifnull(cfn.first_name, '') as first_name, 
  ifnull(cln.last_name, '') as last_name, 
  ifnull(ce.email_address, '') as email_address, 
  ifnull(cm.mobile_phone, '') as mobile_phone
from (
    select ls.subscriberid, ifnull(s.data, '') as first_name
    from subscribers_data s
      right outer join list_subscribers ls on ls.subscriberid = s.subscriberid
    where s.fieldid = 2 /* First Name */
) cfn
right outer join (
    select ls.subscriberid, ifnull(s.data, '') as last_name
    from subscribers_data s
      right outer join list_subscribers ls on ls.subscriberid = s.subscriberid
    where s.fieldid = 3 /* Last Name */
) cln on cfn.subscriberid = cln.subscriberid
right outer join (
    select ls.subscriberid, ls.emailaddress as email_address
    from list_subscribers ls
) ce on ce.subscriberid = cfn.subscriberid
right outer join (
    select ls.subscriberid, ifnull(s.data, '') as mobile_phone
    from subscribers_data s
      right outer join list_subscribers ls on ls.subscriberid = s.subscriberid
    where s.fieldid = 81 /* Mobile Phone */
) cm on cm.subscriberid = cfn.subscriberid
right outer join list_subscribers ls on ls.subscriberid = cfn.subscriberid
inner join lists l on ls.listid = l.listid

【问题讨论】:

    标签: mysql views subquery


    【解决方案1】:

    试试这个:

    SELECT ls.subscriberid as id, l.name as list_name, 
           ifnull(group_concat(CASE WHEN s.fieldId = 2 
                                    THEN s.data 
                                    ELSE NULL 
                               END), '') as first_name, 
           ifnull(group_concat(CASE WHEN s.fieldId = 3
                                    THEN s.data 
                                    ELSE NULL 
                               END), '') as last_name, 
           ifnull(ls.email_address, '') as email_address, 
           ifnull(group_concat(CASE WHEN s.fieldId = 81
                                    THEN s.data 
                                    ELSE NULL 
                               END), '') as mobile_phone
      FROM list_subscribers ls
    INNER JOIN lists l on ls.listid = l.listid
     LEFT JOIN subscribers_data s on ls.subscriberid = s.subscriberid
      GROUP BY ls.subscriberid, l.name, ls.email_address
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 2011-01-17
      • 2018-08-17
      • 2012-12-24
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多