Результат объединения таблицы базы данных

Я пытаюсь показать те же результаты таблицы в одном столбце, и это хорошо, используя:

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

Чтобы представить, что я хочу сделать:

введите описание изображения здесь

Есть идеи?

-2

Решение

Более эффективный способ достижения этого результата:

( 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Затем мы хотим изменить выражение в правой части сравнений неравенства в запросах, чтобы они возвращали совместимые и сопоставимые типы данных и значения.

1

Другие решения

Если вы хотите указать только имя в «время начала», выполните:

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

По вопросам рекламы [email protected]