将 2 个不同的查询合并为一个

Posted

技术标签:

【中文标题】将 2 个不同的查询合并为一个【英文标题】:Combining 2 different queries into one 【发布时间】:2016-03-10 20:13:30 【问题描述】:

我有 2 个查询,我想合并为 1 个。但是,我收到了一个错误:

//第一个查询:
选择
  @rownum := @rownum +1 `index`
  , t。 *
FROM ipAll t, ( SELECT @rownum :=0 ) r

//第二个查询:

选择不同的
  计数(IP)
  , 总和(查看次数)
  , 日期
来自 ipAll
WHERE date LIKE '%-12-%'
按日期分组
按日期排序 ASC
限制 31

// 组合查询:(完全错误。我该如何解决?)

 选择
  @rownum := @rownum +1 `index`
  ,不同的计数(IP)
  , 总和(查看次数)
  , 日期
FROM ipAll t, ( SELECT @rownum :=0 ) r
WHERE date LIKE '%-12-%'
按日期分组
按日期排序 ASC
限制 31

【问题讨论】:

结合是什么意思?你能举例说明这两个查询的结果吗?以及您希望如何合并这些结果?在 mysql 中,有一条 UNION 语句,它将合并多个查询的结果。但是,结果需要具有相同的列。 【参考方案1】:

我建议删除distinct

假设您的表格包含以下内容:

|                         dt |      ip | views |
|----------------------------|---------|-------|
| December, 01 2015 00:00:00 | 1.1.1.1 |   100 |
| December, 01 2015 00:00:00 | 2.2.2.2 |    10 |
| December, 02 2015 00:00:00 | 3.3.3.3 |     4 |
| December, 01 2014 00:00:00 | 1.1.1.1 |   100 |
| November, 01 2015 00:00:00 | 1.1.1.1 |     1 |
| November, 01 2015 00:00:00 | 2.2.2.2 |     2 |

查询:

SELECT 
@rownum := @rownum +1 `index`,
COUNT( ip ), SUM( views ) , dt 
FROM ipAll,  ( SELECT @rownum :=0 ) r 
WHERE dt LIKE '%-12-%' 
GROUP BY dt 
ORDER BY dt ASC 
LIMIT 31;

将导致:

| index | COUNT( ip ) | SUM( views ) |                         dt |
|-------|-------------|--------------|----------------------------|
|     3 |           1 |          100 | December, 01 2014 00:00:00 |
|     1 |           2 |          110 | December, 01 2015 00:00:00 |
|     2 |           1 |            4 | December, 02 2015 00:00:00 |

获得相似(不完全相同)结果的另一种方法是:

select @rownum := @rownum +1 `index`, main.*
from ( SELECT @rownum :=0 ) r, (
  SELECT COUNT( ip ), SUM( views ) , dt 
  FROM ipAll
  WHERE dt LIKE '%-12-%' 
  GROUP BY dt 
  LIMIT 31
) main
ORDER BY dt ASC

结果如下:

| index | COUNT( ip ) | SUM( views ) |                         dt |
|-------|-------------|--------------|----------------------------|
|     1 |           1 |          100 | December, 01 2014 00:00:00 |
|     2 |           2 |          110 | December, 01 2015 00:00:00 |
|     3 |           1 |            4 | December, 02 2015 00:00:00 |

SQLFiddle 示例:http://sqlfiddle.com/#!9/beb98/3

【讨论】:

非常好。在我意识到它是日期的缩写之前,我对名为 dt 的列感到困惑。

以上是关于将 2 个不同的查询合并为一个的主要内容,如果未能解决你的问题,请参考以下文章

Postgres如何将2个单独的选择查询合并为1个

Entity Framework Core:如何将 2 个 COUNT 查询合并为一个

Laravel:将 2 个查询合并为 1 个

Microsoft Access 查询 - 将两个查询合并为一个

将两个不同 where 的查询合并为 1

将 2 个内部连接结果合并为一个结果