我试图在一列中显示相同的表格结果,并且使用得很好:
$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)";
想象一下我想做什么:
有什么想法吗?
答案 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`)
我们假设start
和end
是数据类型DATE
。如果这些存储为VARCHAR
,那么我们希望修改查询中不等式比较右侧的表达式,以便它们返回兼容且可比较的数据类型和值。
答案 1 :(得分:0)
如果你只想在"开始"时间,然后做:
select start as thedate, name
from my_table
union all
select end, NULL
from mytable
order by thedate;