SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.10.2009 13:14:34

SandZ
Участник
Зарегистрирован: 08.10.2009
Сообщений: 7

помогите пожалуйста

есть таблица
===========================
id | name | start | end|
==================
1 | aaa    |2009-10-01 | 2009-10-20|

и т.д.

бывает что start и end имеют одинаковые значения, бывает что разница месяц!...
нужно выбрать записи за сегодня ... тоесть где старт больше или равно , и (  или) енд ...
пробывал так SELECT * FROM table WHERE date >= '2009-10-01' AND end <= '2009-10-20'

Неактивен

 

#2 14.10.2009 13:26:12

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6624

Re: помогите пожалуйста

WHERE DATE() BETWEEN `start` AND `end`

Только индекс использовать не будет.

Неактивен

 

#3 14.10.2009 13:35:10

SandZ
Участник
Зарегистрирован: 08.10.2009
Сообщений: 7

Re: помогите пожалуйста

спасибо большое
помогло

Неактивен

 

#4 14.10.2009 13:39:26

SandZ
Участник
Зарегистрирован: 08.10.2009
Сообщений: 7

Re: помогите пожалуйста

стоп
не могу
если указать вместо DATE именно дату, то работает
если использовать DATE('Y-n-d') не получается 0 записей

SELECT * FROM afisha WHERE (DATE('Y-n-d') BETWEEN `date` AND `end`) ORDER BY RAND() LIMIT 1

Неактивен

 

#5 14.10.2009 14:12:23

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5246

Re: помогите пожалуйста

А что по вашему означает запись DATE('Y-n-d')? На мой взгляд (и сервер MySQL со мной согласен) это некорректный аргумент для функции DATE().
См. http://dev.mysql.com/doc/refman/5.0/en/ … tions.html


Не надо использовать ORDER BY RAND()
При выполнении этого запроса MySQL запишет во временную таблицу все строки исходной таблицы с новым полем, в котором будет содержаться результат выполнения функции RAND(). А потом будет сортировать в памяти эту таблицу по значениям добавочного поля.

P.S. Колонка все-таки называется `date` или `start`?

Неактивен

 

#6 14.10.2009 14:41:42

SandZ
Участник
Зарегистрирован: 08.10.2009
Сообщений: 7

Re: помогите пожалуйста

с датой разобрался .. написал CURDATE()

а как же мне выбрать случайную запись ?

P.S. есть разница?) date)

Неактивен

 

#7 14.10.2009 17:10:40

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5246

Re: помогите пожалуйста

SandZ написал:

а как же мне выбрать случайную запись ?

Реализация средствами MySQL следующая:

   SELECT COUNT(*) INTO @row_count FROM mytabl;  --  считаете кол-во строк в таблице
    SET @rand_row = round(rand() * @row_count);  -- выбираем случайное значение от 0 до кол-ва строк в таблице
/* Теперь вам нужно выбрать произвольную запись с помощью конструкции LIMIT @rand_row, 1;
Однако в части LIMIT нельзя использовать переменные или функции, там должны быть только константы. Для преодоления этой сложности используются подготовленные выражения - вариант динамического SQL
*/

    SET @query = CONCAT('SELECT id INTO @id FROM mytabl LIMIT ',@rand_row,', 1');  -- составляем текст запроса
    PREPARE zxc FROM @query;  -- готовим выражение
    EXECUTE zxc;  -- исполняем выражение
 


Подробнее об использованных пользовательских переменных, подготовленных выражений и многом другом вы можете посмотреть в теме http://sqlinfo.ru/forum/viewtopic.php?id=363

Неактивен

 

#8 14.10.2009 18:42:20

SandZ
Участник
Зарегистрирован: 08.10.2009
Сообщений: 7

Re: помогите пожалуйста

спасибо , буду разбираться

Неактивен

 

#9 25.10.2009 01:19:32

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3762

Re: помогите пожалуйста

LIMIT для выборки случайной записи мощное, но неэффективное по производительности решение. Можно реализовать более быстрый алгоритм, если предположить, что записи идут подряд или почти подряд по id.

1. SELECT MIN(id) min, MAX(id) max, COUNT(*) c FROM mytabl;
2. Вычисляем n = (max-min)/c, округляем вверх до целого
3. n  - это характеристика прореженности таблицы, то есть если n=2, то примерно каждый второй id соответствует некой записи в таблице
4. Если n>50 используем метод, предложенный Васей в посте #7 (при больших n выборка по id не будет более эффективна, чем сортировка всего массива)
5. Генерируем n целых чисел i_n,  min <= i_n <= max
6. Делаем выборку SELECT * FROM mytabl WHERE id in (i_1, i_2, .. i_n) ORDER BY RAND() LIMIT 1
7. Мы ожидаем, что в выборке будет одна запись. Если в выборке нет записей, возвращаемся к шагу 5.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson