Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Разное число rows двух запросов при explain


Автор: rcdimon 14.11.2008, 10:21
Всем привет. 

У меня есть таблица, в которой хранится большое число строк. Есть колонка с именем date типа DATE.  Строк в таблице много, но разных дат где-то 12-15.

Мне необходимо получить список этих дат.

Код

SELECT DISTINCT
    `date`
FROM
    `action`
ORDER BY
    `date` ASC


Делаю EXPLAIN результат rows - 15

Но мне хотелось бы дату в другом формате.

Код

SELECT DISTINCT
    DATE_FORMAT(`date`, '%d.%m.%Y') AS `date`
FROM
    `action`
ORDER BY
    `date` ASC


Результат EXPLAIN rows - 20'000 (У меня столько строк в таблице)

Получается во втором случае он просматривает всю таблицу.. Почему так? Мне не хотелось бы использовать такой неэфективный запрос, но формал даты хочу получить нужный...

Автор: Akina 14.11.2008, 10:33
Запросы РАДИКАЛЬНО разные. В одном используется функция - а это filesearch без вариантов. 
PS. Учти просто, что одна и та же функция при нескольких вызовах с одним и тем же параметром имеет право вернуть разные значения. Например, так делает Rand(). И EXPLAIN тоже это знает.

Автор: skyboy 14.11.2008, 11:45
можно использовать форматирование поверх подзапроса. это вызовет using temporary, но, по идее, только для 15 записей. 

Автор: rcdimon 14.11.2008, 12:06
Очень хорошая мысль. Можно, пожалуйста, пример? А то мне выдает 

Цитата

Subquery returns more than 1 row



Автор: Akina 14.11.2008, 12:11
Код

SELECT
    DATE_FORMAT(`date`, '%d.%m.%Y') AS `date`
FROM
(
SELECT DISTINCT
    `date`
FROM
    `action`
)
ORDER BY
    `date` ASC

Автор: rcdimon 14.11.2008, 12:15
Ого, не знал что так можно! Спасибо!

Добавлено через 4 минуты и 5 секунд
Пришлось правда дописать после

FROM (...) AS `table_name`, иначе говорил

Цитата

Every derived table must have its own alias


Вдруг кому-то еще пригодится )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)