这可以通过JOIN语句来完成吗?
问题描述:
我有五个结构相当相似的表,但它们不同,我想让它们作为单独的表。实质上,这些表格将事件记录在五个不同的“类别”中,这些“类别”具有一些共同字段和一些其他独特字段这可以通过JOIN语句来完成吗?
现在看来我需要编写一份报告,其中所有五个表中的记录按记录创建时间戳(所有表的标准)的降序显示。所有表都有我需要的常用字段,例如fName,lName,scorePercent,numCorrect等。
我似乎无法找出编写查询以从所有五个表中选择记录并显示它们的最佳方法在一个表中,列中显示记录来自的表格以及按日期时间降序排列的公共字段的值。
有没有简单的方法来做到这一点?我必须使用PHP来完成吗?我开始质疑我的原创设计。
谢谢。
答
如果数据足够相似,是查询在一起,它可能类似于足以成为存储一起一个表,一个额外的列来记录类型,但是......
select * from (
select 'table1', timestamp_col, fName, lName, scorePercent, numCorrect
from table1 where ...
UNION ALL
select 'table2', timestamp_col, fName, lName, scorePercent, numCorrect
from table2 where ...
UNION ALL
select 'table3', timestamp_col, fName, lName, scorePercent, numCorrect
from table3 where ...
UNION ALL
select 'table4', timestamp_col, fName, lName, scorePercent, numCorrect
from table4 where ...
UNION ALL
select 'table5', timestamp_col, fName, lName, scorePercent, numCorrect
from table5 where ..
) x
order by timestamp_col desc
你可以使用一个单一的,其中内查询外的声明,但它会表现不佳,因为全部行的全部这些表将被合并。这样,只有实际需要的行是联合的。
注意UNION ALL
比UNION
一个更好的选择,因为UNION ALL
不排序(与UNION
数据将被整理两次 - 一次通过的顺序删除重复项,并再次)。
答
您可以使用UNION ALL
声明。因此,也许是这样的:
SELECT
fName, lName, scorePercent, numCorrect,date, 1 AS type
FROM
table1
UNION ALL
SELECT
fName, lName, scorePercent, numCorrect,date, 2 AS type
FROM
table2
UNION ALL
SELECT
fName, lName, scorePercent, numCorrect,date, 3 AS type
FROM
table3
UNION ALL
SELECT
fName, lName, scorePercent, numCorrect,date, 4 AS type
FROM
table4
UNION ALL
SELECT
fName, lName, scorePercent, numCorrect,date, 5 AS type
FROM
table5
ORDER BY date
谢谢你的见解。我意识到这些数据可能属于您所描述的类型区分的一个表。但我只是想确定,因为我没有任何延伸的DBA ...是一种很好的做法,只有与表中的一种类型相关的字段具有NULL值,这对于所有将忽略该列的类型都是NULL值? – JohnCharles117 2012-04-06 15:04:03
您正在讨论通常称为“解析数据”的内容(有许多列为空的表)。只要它不会失控,它就是“好的”。经典的设计说让他们分开,但实用性表示,这是在单一表格的便利性与仅适用于某些类型的列的麻烦/耻辱之间的权衡。我仍然会选择一张桌子,因为我赞同“一刀切”的思想观点,便利方面可以相当大,不应该为了“好设计”而被抛弃。毕竟设计是针对人类的,而不是计算机。 – Bohemian 2012-04-06 15:40:38