[英]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.