数据库 table 并集结果

Database table union result

我试图在一栏中显示相同的 table 结果,并且使用以下方法运行良好:

$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)";

想象一下我想做什么:

有什么想法吗?

如果你只想要 "start" 次的名字,那么做:

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

实现该结果的更有效方法:

( 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

注意:由于要 returned 的最大行数是 10,我们只需要 return 10 行带有 start 日期,10 行带有 end日期。这将避免创建一个庞大的结果集,MySQL 将不得不对其进行排序 ("Using filesort") 以使它们按正确的顺序排列。

我们也可以避免外部 select,使用 "implicit" UNION ALL 操作。 (这是 SQL 标准的 MySQL 扩展,不需要外部查询。)

我们包括 name 列的值和 start 日期,我们包括 name 列和 end 日期的静态虚拟值.我们这样做是为了满足 UNION ALL 操作的要求(即列数和列的数据类型必须匹配。)我们可以很容易地提供一个空字符串或任何其他文字值来代替空值。

如果有合适的索引可用,

MySQL可以非常有效地满足查询,例如

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

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