Сoutn + Date = "статистика"

WMix

герр M:)ller
Партнер клуба
Сoutn + Date = "статистика"

пишу статистику
---------------------------------------------------

поле datum имеет тип datetime
как выбрать поля с сегоднешней датой?

WHERE datum = CURDATE()

---------------------------------------------------
SELECT COUNT(id) AS anz FROM admin_banstat WHERE an='".$USER["id"]."'

SELECT COUNT(id) AS anz FROM admin_banstat WHERE an='".$USER["id"]."' AND datum > DATE_SUB( NOW(), INTERVAL 7 DAY)

можно ли обьеденить эти 3 запроса (3.й запрос в первом вопросе) в один?
 

WMix

герр M:)ller
Партнер клуба
ну будут и другие запросы

и потом одним запросом вроде быстрее (или я ошибаюсь)
 

Demiurg

Guest
>и потом одним запросом вроде быстре
ошибаешься
 

WMix

герр M:)ller
Партнер клуба
ОК
а с первым вопросом не поможеш bitte?
 

Demiurg

Guest
какой первый ?
выбрать сегодняшние записи ?

where datum between $today_begin and $today_end
если хочешь, что бы индексы использовались.
$today_begin и $today_end высчитываешь на пхп
 

WMix

герр M:)ller
Партнер клуба
а только sql

datum > DATE_SUB( NOW(), INTERVAL 0 DAY)
 

WMix

герр M:)ller
Партнер клуба
не понял это как
* огласите пожалуйста весь список
 

WMix

герр M:)ller
Партнер клуба
не понял DATE_SUB( NOW(), INTERVAL 0 DAY) == now() как вписать в запрос?

решил так
DATE_FORMAT(datum,\"%Y-%m-%d\")= CURDATE()
 

Demiurg

Guest
>не понял DATE_SUB( NOW(), INTERVAL 0 DAY) == now() как вписать в запрос?
это не надо вписывать в запрос, я говорю, что DATE_SUB( NOW(), INTERVAL 0 DAY) это тоже самое, что now()

>решил так
>DATE_FORMAT(datum,\"%Y-%m-%d\")= CURDATE()
не надо так делать, так индексы не используются
 

chira

Новичок
чтобы использовался индекс (если он есть)
WHERE datum LIKE CONCAT(CURDATE(),'%')
 

Demiurg

Guest
chira а ты уверен, что тут индекс будет использоваться ?
 

chira

Новичок
Код:
mysql> select dtime from d where dtime like CONCAT(CURDATE(),'%');
+---------------------+
| dtime               |
+---------------------+
| 2003-06-19 19:30:16 |
| 2003-06-19 19:30:49 |
| 2003-06-19 19:31:27 |
| 2003-06-19 19:31:39 |
+---------------------+
4 rows in set (0.00 sec)

mysql> explain select dtime from d where dtime like CONCAT(CURDATE(),'%');
+-------+-------+---------------+----------+---------+------+------+-------------------------+
| table | type  | possible_keys | key      | key_len | ref  | rows | Extra                   |
+-------+-------+---------------+----------+---------+------+------+-------------------------+
| d     | index | NULL          | di_dtime |       9 | NULL |   17 | where used; Using index |
+-------+-------+---------------+----------+---------+------+------+-------------------------+
1 row in set (0.00 sec)

mysql> select count(*) from d where dtime like CONCAT(CURDATE(),'%');
+----------+
| count(*) |
+----------+
|        4 |
+----------+
1 row in set (0.00 sec)

mysql> explain select count(*) from d where dtime like CONCAT(CURDATE(),'%');
+-------+-------+---------------+----------+---------+------+------+-------------------------+
| table | type  | possible_keys | key      | key_len | ref  | rows | Extra                   |
+-------+-------+---------------+----------+---------+------+------+-------------------------+
| d     | index | NULL          | di_dtime |       9 | NULL |   17 | where used; Using index |
+-------+-------+---------------+----------+---------+------+------+-------------------------+
1 row in set (0.00 sec)

mysql>
//добавил побольше данных
 

WMix

герр M:)ller
Партнер клуба
Блин ребята у вас тут горячая дискусия

=============================
chira & Demiurg: Так тут индекс будет использоваться ?
WHERE datum LIKE CONCAT(CURDATE(),'%')

мне эта строчка нравится
она открывает новые горизонты при работе с типом date and datetime
 

Demiurg

Guest
chira, интересная вещь получается. Значит mysql в индексе хранить строковое представление даты...
Хотя я бы все равно не стал бы пользоваться таким методом.
 

Апельсин

Оранжевое создание
с версии 4.1 DATETIME это integer, так что я бы не советовала использовать LIKE - он не будет работать. Используйте вместо него BETWEEN.
 
Сверху