数据库表联合结果

时间:2015-01-23 16:32:59

标签: php mysql union

我试图在一列中显示相同的表格结果,并且使用得很好:

$sql = "(select * from ( select start as date from my_table union all select end from my_table ) tmp WHERE date > SUBDATE(CURDATE(),0) order by date limit 10)";

想象一下我想做什么:

enter image description here

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

实现这一结果的更有效方法:

( SELECT s.start AS `date`
       , s.name  AS `name`
    FROM my_table s
   WHERE s.start > CURDATE() - INTERVAL 0 DAY
   ORDER BY s.start
   LIMIT 10
)
UNION ALL
( SELECT e.end   AS `date`
       , NULL    AS `name`
    FROM my_table e
   WHERE e.end   > CURDATE() - INTERVAL 0 DAY
   ORDER BY e.end
   LIMIT 10
 )
 ORDER BY `date`
 LIMIT 10

注意:由于要返回的最大行数为10,因此我们只需返回包含start日期的10行和包含end日期的10行。这将避免创建一个巨大的结果集,MySQL必须对其进行排序(“使用filesort”)以正确的顺序获取它们。

我们还可以使用“隐式”UNION ALL操作来避免外部选择。 (这是SQL标准的MySQL扩展,不需要外部查询。)

我们包含name列的值以及start日期,并且我们为name列添加了end日期的静态虚拟值。我们这样做是为了满足UNION ALL操作的要求(即列的列数和数据类型必须匹配。)我们可以轻松地提供空字符串或任何其他文字值来代替NULL。

如果有合适的索引,MySQL可以非常有效地满足查询,例如

... ON my_table (`start`,`name`)
... ON my_table (`end`)

我们假设startend是数据类型DATE。如果这些存储为VARCHAR,那么我们希望修改查询中不等式比较右侧的表达式,以便它们返回兼容且可比较的数据类型和值。

答案 1 :(得分:0)

如果你只想在"开始"时间,然后做:

select start as thedate, name
from my_table
union all
select end, NULL
from mytable
order by thedate;