嗨我不确定这是否可行: - 我有一个名为delivery的表,列有很多列,这是一个非常庞大的表,这是我广告服务器的源表。
在许多列中,我想要获取3列(广告系列,展示位置,网站)中的DISTINCT
,即来自交付的不同广告系列以及来自交付和不同网站与交付的不同展示位置。
我正在为此运行3个不同的SQL Select。
有没有办法我们可以从一个查询中找到这个,因为运行多个查询会减慢它表中有多种数据......
目前我正在使用: -
SELECT
(SELECT GROUP_CONCAT(DISTINCT campaign SEPARATOR '^^') FROM delivery ) as campaign,
(SELECT GROUP_CONCAT(DISTINCT placement SEPARATOR '^^') FROM delivery ) as placement,
(SELECT GROUP_CONCAT(DISTINCT site SEPARATOR '^^' ) FROM delivery ) as site";
这有性能问题,我们有更好的解决方案。?
答案 0 :(得分:0)
您可以将GROUP BY子句与三个字段一起使用:
SELECT campaign, placement, site FROM table_foo GROUP BY campaign, placement, site
这个问题的一个重要问题,在这种情况下适用,因为你说它是一个巨大的"表,这将使用临时表并执行文件排序,这两者都可能存在性能问题。
答案 1 :(得分:0)
这是一个查询,但它不会比运行它需要的3个子查询更有效。
select distinct 'campaign' as type, campaign as value
union all
select distinct 'placement', placement
union all
select distinct 'site', site
此问题是在问题中显示现有查询之前准备的。
答案 2 :(得分:0)
取决于您所在的服务器,但如果最新的数据不是最高优先级,您可以使用所需的数据字段每5分钟运行一次cron作业,并使用SELECT INTO将其选择为“编译了“用于选择数据的数据库表。”
从数据库表中简单地选择数据要比现在的操作快得多,因此应该显着提高速度。唯一的缺点是你的数据将每5分钟落后一次。但通常不需要超精确的实时数据。
除此之外我没有看到改进的真正方法,特别是因为你使用concat(字符串操作非常繁琐)