Mysql 如何使用UNIONALL查询获取不在表中的记录?

Mysql 如何使用UNIONALL查询获取不在表中的记录?,mysql,sql,database,Mysql,Sql,Database,我在MYSQL数据库中有一个_ad_显示表,格式如下 ╔═════════════╦═════════╦═════════╦═════════════════════╗ ║ addisplayId ║ restId ║ clicked ║ displaytime ║ ╠═════════════╬═════════╬═════════╬═════════════════════╣ ║ 1 ║ 20707 ║ 0 ║ 2013-03-07 10

我在MYSQL数据库中有一个_ad_显示表,格式如下

╔═════════════╦═════════╦═════════╦═════════════════════╗
║ addisplayId ║ restId  ║ clicked ║     displaytime     ║
╠═════════════╬═════════╬═════════╬═════════════════════╣
║          1  ║  20707  ║      0  ║ 2013-03-07 10:50:55 ║
║          2  ║  20707  ║      1  ║ 2013-03-07 10:55:55 ║
║          3  ║  20711  ║      1  ║ 2013-03-08 12:50:55 ║
║          4  ║  20712  ║      1  ║ 2013-03-08 01:50:55 ║
║          5  ║  20707  ║      1  ║ 2013-03-08 10:50:55 ║
║          6  ║  20708  ║      1  ║ 2013-03-09 12:50:55 ║
║          7  ║  20707  ║      1  ║ 2013-03-09 09:50:55 ║
║          8  ║  20708  ║      0  ║ 2013-03-10 10:50:55 ║
║          9  ║  20708  ║      0  ║ 2013-03-11 11:50:55 ║
║         10  ║  20707  ║      0  ║ 2013-03-11 12:50:55 ║
╚═════════════╩═════════╩═════════╩═════════════════════╝
现在,我想要的是获取restId的记录以及最后7天的数据

如果当前日期是2013年3月12日,那么我想显示2013年3月5日至2013年3月11日的数据

     DISPLAY TIME                   CLICKED     count of row(impression)
March, 05 2013 00:00:00+0000            0       0             
March, 06 2013 00:00:00+0000            0       0
March, 07 2013 00:00:00+0000            1       2
March, 08 2013 00:00:00+0000            1       1
March, 09 2013 00:00:00+0000            1       1
March, 10 2013 00:00:00+0000            1       1
March, 11 2013 00:00:00+0000            0       1
我想忽略计时。只想在获取记录日期时关注日期 我想获取restId=10707的记录,其中包含表中该日期的行总数和该日期的点击总数,如果表中没有上周日期的任何日期的记录,那么它应该打印该日期,并在“点击”中打印0,在“行数”列中打印0

我用SQL fiddle制作了一个虚拟表,也应用了这个查询,但它不起作用。所以任何人都可以指导我…我知道这很难理解…但是如果你对我的问题有任何疑问…那么我会清除你,从你方获得解决方案

以下是我的问题,没有给出正确的数据

select
  displaytime,
  sum(impression) as clicked,
  (count(impression) -1) as impressions
from (
  select
    displaytime,
    a_ad_display.clicked as impression
  from
    a_ad_display
  where
    a_ad_display.displaytime
  BETWEEN
    date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -6 day)
    AND
    CONVERT_TZ(CURDATE( ),'+00:00','-11:00')
    and
    restId=10708
    group by
      a_ad_display.displaytime
    union distinct
    select
      CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), 0
    union distinct
    select
      date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -1 day), 0
    union distinct
    select
      date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -2 day), 0
    union distinct
    select
      date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -3 day), 0
    union distinct
    select
      date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -4 day), 0
    union distinct
    select
      date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -5 day), 0
    union distinct
    select
      date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -6 day), 0
) as x
group by
  date(displaytime)
order by
  displaytime
请忽略代码CONVERT_TZCURDATE,“+00:00”,“-11:00”,因为它只是将我的日期从utc转换为用户时区

这是我的sql fiddle链接
看看这个问题:


这与您正在做的几乎相同

看看这个问题:


这与您正在做的几乎相同

可能有一种更干净的方法,但这应该是可行的

select
  displaytime,
  sum(clicked) as clicked,
  sum(impressions) as impressions
from (
select
  displaytime,
  clicked,
  impressions
from (
select
  date(displaytime) as displaytime,
  sum(impression) as clicked,
  sum(legit) as impressions
from (
  select
    displaytime,
    a_ad_display.clicked as impression,
  1 as legit
  from
    a_ad_display
  where
    a_ad_display.displaytime
  BETWEEN
    date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -6 day)
    AND
    CONVERT_TZ(CURDATE( ),'+00:00','-11:00')
    and
    restId=10708
) as x
group by
  date(displaytime)
) y
union distinct
    select
      date(CONVERT_TZ(CURDATE( ),'+00:00','-11:00')), 0, 0
    union distinct
    select
      date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -1 day)), 0, 0
    union distinct
    select
      date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -2 day)), 0, 0
    union distinct
    select
      date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -3 day)), 0, 0
    union distinct
    select
      date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -4 day)), 0, 0
    union distinct
    select
      date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -5 day)), 0, 0
    union distinct
    select
      date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -6 day)), 0, 0
) z
group by
  displaytime
order by
  displaytime

也许有更干净的方法,但这应该行得通

select
  displaytime,
  sum(clicked) as clicked,
  sum(impressions) as impressions
from (
select
  displaytime,
  clicked,
  impressions
from (
select
  date(displaytime) as displaytime,
  sum(impression) as clicked,
  sum(legit) as impressions
from (
  select
    displaytime,
    a_ad_display.clicked as impression,
  1 as legit
  from
    a_ad_display
  where
    a_ad_display.displaytime
  BETWEEN
    date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -6 day)
    AND
    CONVERT_TZ(CURDATE( ),'+00:00','-11:00')
    and
    restId=10708
) as x
group by
  date(displaytime)
) y
union distinct
    select
      date(CONVERT_TZ(CURDATE( ),'+00:00','-11:00')), 0, 0
    union distinct
    select
      date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -1 day)), 0, 0
    union distinct
    select
      date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -2 day)), 0, 0
    union distinct
    select
      date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -3 day)), 0, 0
    union distinct
    select
      date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -4 day)), 0, 0
    union distinct
    select
      date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -5 day)), 0, 0
    union distinct
    select
      date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -6 day)), 0, 0
) z
group by
  displaytime
order by
  displaytime
RESTID20707的其他解决方案。2013年3月10日,没有restID 20707的记录

查询:

RESTID20707的其他解决方案。2013年3月10日,没有restID 20707的记录

查询:


此查询应显示正确的数据。不是一个非常“干净”的解决方案。如果确实希望包含没有数据的日期,则应使用日历表替换这些联合

SELECT IFNULL(z.displaytime, x.displaytime), IFNULL(z.clicked, 0), IFNULL(z.count, 0)  FROM

  (select
    date(CONVERT_TZ(CURDATE( ),'+00:00','-11:00')) AS 'displaytime', 0 AS 'Clicked', 0 AS 'count of row(impression)'
  union distinct
  select
    date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -1 day)), 0, 0
  union distinct
  select
    date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -2 day)), 0, 0
  union distinct
  select
    date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -3 day)), 0, 0
  union distinct
  select
    date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -4 day)), 0, 0
  union distinct
  select
    date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -5 day)), 0, 0
  union distinct
  select
    date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -6 day)), 0, 0) AS x

LEFT JOIN

  (SELECT
    DATE(displaytime) AS 'displaytime',
    MAX(clicked) AS 'Clicked',
    COUNT(*) AS 'Count'
  FROM 
    a_ad_display
  WHERE (
    displaytime BETWEEN date_add(CURDATE(), interval -6 day) AND CURDATE()
  ) AND restId = 10707 
  GROUP BY DATE(displaytime)) AS z
ON x.displaytime = z.displaytime

此查询应显示正确的数据。不是一个非常“干净”的解决方案。如果确实希望包含没有数据的日期,则应使用日历表替换这些联合

SELECT IFNULL(z.displaytime, x.displaytime), IFNULL(z.clicked, 0), IFNULL(z.count, 0)  FROM

  (select
    date(CONVERT_TZ(CURDATE( ),'+00:00','-11:00')) AS 'displaytime', 0 AS 'Clicked', 0 AS 'count of row(impression)'
  union distinct
  select
    date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -1 day)), 0, 0
  union distinct
  select
    date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -2 day)), 0, 0
  union distinct
  select
    date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -3 day)), 0, 0
  union distinct
  select
    date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -4 day)), 0, 0
  union distinct
  select
    date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -5 day)), 0, 0
  union distinct
  select
    date(date_add(CONVERT_TZ(CURDATE( ),'+00:00','-11:00'), interval -6 day)), 0, 0) AS x

LEFT JOIN

  (SELECT
    DATE(displaytime) AS 'displaytime',
    MAX(clicked) AS 'Clicked',
    COUNT(*) AS 'Count'
  FROM 
    a_ad_display
  WHERE (
    displaytime BETWEEN date_add(CURDATE(), interval -6 day) AND CURDATE()
  ) AND restId = 10707 
  GROUP BY DATE(displaytime)) AS z
ON x.displaytime = z.displaytime

答案是thanx。它起作用了。但是为什么这不是一个干净的解决方案呢?答案是thanx。它起作用了。但是为什么这不是一个干净的解决方案呢?