首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加入还是SubQuery?

加入还是SubQuery?
EN

Stack Overflow用户
提问于 2016-01-13 12:06:49
回答 6查看 55关注 0票数 0

我有一个MySQL表,它记录了在各种网站上使用的插件标题,包括版本号。例如:

代码语言:javascript
复制
    AddonName | Website ID | Version

    ZZZ         1           3.3
    ZZZ         2           3.4
    ZZZ         3           3.4
    ZZZ         4           3.1
    YYY         1           1.1
    YYY         2           1.1
    YYY         3           1.1
    YYY         4           1.2

我想要创建一个查询,其中列出了一个不同的AddonName列表,其中包括总计数、使用最新版本的所有站点的计数以及使用过期版本的所有站点的计数。

即:

代码语言:javascript
复制
    Name | Total Addons | Up to Date | Out of Date
    ZZZ    4              2            2
    YYY    4              1            3

我不知道如何得到这种类型的数据返回,即使信息都在那里。我尝试使用JOIN查询,但没有成功。

如果这有助于简化操作,我可以在表中添加一个‘最新’枚举字段,在导入时将行标记为最新的或过时的。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-01-13 12:47:19

假设最大值为最新版本。

试试这个:

代码语言:javascript
复制
select t1.AddonName,
count(*) as total_Addon,
sum(case when t1.version=t2.version then 1 else 0 end) as up_to_date,
sum(case when t1.version!=t2.version then 1 else 0 end) as out_of_date
from table1 t1
inner join(
  select AddonName,max(version) as version
  from table1 group by AddonName
)t2 on t1.AddonName=t2.AddonName 
group by t1.AddonName
票数 2
EN

Stack Overflow用户

发布于 2016-01-13 12:38:59

尝试:

代码语言:javascript
复制
SELECT your_table.AddonName,
   COUNT(`Website ID`),
   COUNT(IF(Version = your_table_max.max_version, 1, NULL)) AS `Up to Date`,
   COUNT(IF(Version <> your_table_max.max_version, 1, NULL)) AS `Out of Date`
  FROM your_table
    INNER JOIN (SELECT MAX(Version) as max_version, AddonName
                  FROM your_table group by AddonName) your_table_max
    ON your_table_max.AddonName = your_table.AddonName
  GROUP BY your_table.AddonName;
票数 1
EN

Stack Overflow用户

发布于 2016-01-13 12:39:10

假设最新版本来自上一栏:

代码语言:javascript
复制
select t.name, count(*) as TotalAddons,
       sum(t.version = tt.maxv) as UpToDate,
       sum(t.version <> tt.maxv) as OutOfDate
from t join
     (select name, max(version) as maxv
      from t
      group by name
     ) tt
     on t.name = tt.name
group by t.name;

这将计算子查询中每个名称的最大版本号。然后,它将该信息用于外部聚合。

这假设版本是一个数字。如果它是一个字符串(所以1.10 > 1.2),那么类似的方法是:

代码语言:javascript
复制
select t.name, count(*) as TotalAddons,
       sum(t.version = t.maxv) as UpToDate,
       sum(t.version <> t.maxv) as OutOfDate
from (select t.*,
             (select version
              from t t2
              where t2.name = t.name
              order by length(version) desc, version desc
              limit 1
             ) as maxv
      from t
     ) t
group by t.name;

当然,这也适用于数字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34766296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档