Я пытаюсь показать те же результаты таблицы в одном столбце, и это хорошо, используя:
$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)";
Чтобы представить, что я хочу сделать:
Есть идеи?
Более эффективный способ достижения этого результата:
( 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, нам нужно вернуть только 10 строк с start
дата и 10 строк с end
Дата. Это позволит избежать создания огромного набора результатов, который MySQL должен будет отсортировать («Использование файловой сортировки»), чтобы получить их в правильном порядке.
Мы также можем избежать внешнего выбора, используя «неявную» операцию UNION ALL. (Это расширение MySQL к стандарту SQL, не требующее внешнего запроса.)
Мы включаем значение name
столбец вместе с start
даты, и мы включаем статическое фиктивное значение для name
колонка с end
даты. Мы делаем это так, чтобы удовлетворить требования UNION ALL
операция (т. е. количество столбцов и типы данных столбцов должны совпадать.) Мы могли бы так же легко предоставить пустую строку или любое другое литеральное значение вместо NULL.
MySQL может очень эффективно удовлетворить запрос, если доступны подходящие индексы, например,
... ON my_table (`start`,`name`)
... ON my_table (`end`)
Мы предполагаем, что start
а также end
являются типом данных DATE
, Если они хранятся как VARCHAR
Затем мы хотим изменить выражение в правой части сравнений неравенства в запросах, чтобы они возвращали совместимые и сопоставимые типы данных и значения.
Если вы хотите указать только имя в «время начала», выполните:
select start as thedate, name
from my_table
union all
select end, NULL
from mytable
order by thedate;