这可以通过JOIN语句完成吗?

时间:2012-04-06 14:13:02

标签: mysql

我有五个表在结构上相当相似,但又不同,我想把它们作为单独的表。从本质上讲,这些表记录了五个不同“类别”中的事件,这些“类别”包含一些共同字段和一些其他唯一字段。

现在看来我需要编写一份报告,其中所有五个表中的记录按记录创建时间戳的降序显示(所有表中的标准)。所有表都有我需要的公共字段,如fName,lName,scorePercent,numCorrect等。

我似乎无法找出编写查询以从所有五个表中选择记录的最佳方法,并将它们显示在一个表中,其中一列显示记录所来自的表和公共字段的值,按日期时间下降。

有没有简单的方法可以做到这一点?我必须用PHP做吗?我开始质疑我原来的设计。

感谢。

2 个答案:

答案 0 :(得分:2)

如果数据足够相似,可以一起查询,那么它可能与一个表中的存储相似,并且有一个额外的列录制类型,但是......

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

您可以在内部查询之外使用单个where语句,但它的执行效果很差,因为 all 所有表的行将被联合。这样,只有实际需要的行被联合起来。

请注意,UNION ALL是比UNION更好的选择,因为UNION ALL不排序(UNION数据将按两次排序 - 一次删除重复项并再次删除订单。

答案 1 :(得分:0)

您可以使用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