我有两个不同的表格,下面给出了他们的模式:
表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)
表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)
我需要一个表,它是这两个表(不是所有列)的合并,行应该根据时间(表1中的log_time和表2中的stats_time)进行排序。这两个表之间没有关系。
Table1中需要的列是
campaign_id
subscriber_id
message
log_time
log_type
campaign_name
我需要从Table2中得到的列是:
url
stats_time
email
我可以获得更优化的解决方案吗?
查询:
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
答案 0 :(得分:0)
从每个表中选择前Limit + Offset
个记录,UNION结果,然后从UNION中选择。
因此,如果用户正在查看第5页,并且每页有20个项目,您将从每个表中选择前100个,执行UNION,然后从结果中选择20个记录。
答案 1 :(得分:0)
一些伪代码 -
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