简体   繁体   English

如何从两个不同的,不相关的表中获取最新的行,并将它们合并到一个结果集中?

[英]How can I get the most recent rows from two different, unrelated tables, and merge them into one result set?

I have two different tables with their schema given below: 我有两个不同的表,其架构如下:

Table1: 表格1:

COLUMN_NAME     COLUMN_TYPE

campaign_id     varchar(50)
subscriber_id   varchar(50)
message         varchar(21000)
log_time        datetime
log_type        varchar(50)
level           varchar(50)
campaign_name   varchar(500)

Table2: 表2:

COLUMN_NAME      COLUMN_TYPE

guid             varchar(100)
sid              varchar(100)
url              varchar(2500)
ip               varchar(20)
is_new           varchar(20)
ref              varchar(2500)
user_agent       varchar(255)
stats_time       datetime
country          varchar(50)
region           varchar(50)
city             varchar(50)
city_lat_long    varchar(50)
email            varchar(100)

I need a table which is a merge of these two tables(not all the columns) and the rows should sorted based on time (which is log_time in Table1 and stats_time in Table2). 我需要一个表,该表是这两个表(不是所有列)的合并,并且行应基于时间(表1中的log_time和表2中的stats_time)进行排序。 There is no relation between these two tables. 这两个表之间没有关系。

The columns which I need from Table1 are 我需要从表1中的列是

campaign_id
subscriber_id
message
log_time
log_type
campaign_name

and the columns which I need from Table2 are: 我需要从Table2中获得的列是:

url
stats_time
email

Can I get more optimised solution? 我可以获得更优化的解决方案吗?

Query: 查询:

SELECT url, ip, stats_time, email, campaign_id, subscriber_id, campaign_name, log_time, log_type, time from
(  
( SELECT url,ip,stats_time,email,NULL AS campaign_id,NULL AS subscriber_id ,NULL AS campaign_name,NULL AS log_time,NULL AS log_type, NULL AS message, UNIX_TIMESTAMP(stats_time) AS time FROM Tabel2 AS Table2Alias WHERE URL !='' AND EMAIL != '') Order by stats_time desc Limit 100

UNION ALL  

( SELECT NULL AS url,NULL AS ip,NULL AS stats_time,NULL AS email,campaign_id,subscriber_id,campaign_name,log_time,log_type,message,UNIX_TIMESTAMP(log_time) AS time FROM Table1 AS Table1Alias WHERE (log_type='x1' OR log_type='x2' OR log_type='x3' OR log_type='x4') order by log_time desc Limit 100)
)
as ResultTable order by time  desc

Select the top Limit + Offset records from each table, UNION the results, then select from the UNION. 从每个表中选择顶部的“ Limit + Offset记录,然后对结果进行UNION,然后从UNION中进行选择。

So if user is viewing page 5, and there are 20 items per page, you will be selecting top 100 from each table, performing UNION, then selecting 20 records from result. 因此,如果用户正在查看第5页,并且每页有20个项目,则将从每个表中选择前100个,执行UNION,然后从结果中选择20条记录。

Some pseudocode for you - 一些适合您的伪代码-

 SELECT 
     /* columns you want */ 
 FROM 
     (
         SELECT 
             /* columns you want */
         FROM
             /* Table1 */ 
         ORDER BY 
             /* Date DESC */
         LIMIT 20 

         UNION ALL 

         SELECT 
             /* columns you want */
         FROM
             /* Table2 */ 
         ORDER BY 
             /* Date DESC */
         LIMIT 20 
    ) 
ORDER BY 
     /* Date DESC */
LIMIT 20

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM