2015-01-23 3 views
-2

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

$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

Любой идеи?

+0

Я не понимаю исходную таблицу данных, которую вы запрашиваете. – johnny

+0

Извините, ошибся. Я редактировал сообщение. – Xinel

+0

Я не вижу оригинальную таблицу. Это верх. Если так, я теряюсь, извините. – johnny

ответ

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, нам нужно вернуть только 10 строк с датой start и 10 строк с датой end. Это позволит избежать создания огромного набора результатов, который MySQL должен будет сортировать («Using filesort»), чтобы получить их в правильном порядке.

Мы также можем избежать внешнего выбора с использованием «неявной» операции 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, мы хотим изменить выражение в правой части сравнения неравенств в запросах, чтобы они возвращали совместимые и сопоставимые типы данных и значения.

+0

@Xinel: В моей спешке, чтобы опубликовать ответ на ваш вопрос, я пропустил предложения 'ORDER BY' во внутренних запросах; запрос образца в моем ответе исправляется, чтобы добавить их. – spencer7593

+0

Спасибо! Это именно то, что мне нужно :) – Xinel

0

Если вы хотите только название на «Start» раз, а затем сделать:

select start as thedate, name 
from my_table 
union all 
select end, NULL 
from mytable 
order by thedate; 
Смежные вопросы