Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выборка по дате и количеству записей
 
 автор: mastergrom   (11.10.2009 в 14:20)   письмо автору
 
 

Добрый день, такой вопрос
есть две таблицы:
table_a:
id
(ну и другие стоблбцы)
И table_b:
id
table_a_id
date (тип TIMESTAMP)
и другие стоблбцы)
--------------
Необходимо получить id из таблицы table_a и количество записей этого id из таблицы b, как скажем id_count, которых в таблице table_b либо нет за сегодняшнюю дату, или количество записей за сегодняшнюю дату в таблице b меньше трех.

  Ответить  
 
 автор: cheops   (11.10.2009 в 14:31)   письмо автору
 
   для: mastergrom   (11.10.2009 в 14:20)
 

Можно отталкиваться от следующего запроса
SELECT table_a.id, COUNT(table_b.id_count) AS total
FROM table_a LEFT JOIN table_b ON (table_a.id = table_b.table_a_id)
WHERE DATE(FROM_UNIXTIME(table_b.date)) = DATE(NOW())
GROUP BY table_a.id
HAVING total < 3

  Ответить  
 
 автор: mastergrom   (11.10.2009 в 14:46)   письмо автору
 
   для: cheops   (11.10.2009 в 14:31)
 


WHERE DATE(FROM_UNIXTIME(table_b.date)) = DATE(NOW()) 

То есть, это только если есть записи за сегодняшнюю дату, получается.. А если записей в таблице b за сегодняшнюю дату нет или в таблице b вобще нет записей ? Можно как-то в одном запросе условие поставить? Может, как-то CASE нужно использовать или OR ?
Например:

WHERE DATE(FROM_UNIXTIME(table_b.date)) = DATE(NOW()) OR total = 0

Попробую ....

Спасибо за наводку )

  Ответить  
 
 автор: Trianon   (11.10.2009 в 14:49)   письмо автору
 
   для: mastergrom   (11.10.2009 в 14:46)
 

>То есть, это только если есть записи за сегодняшнюю дату, получается..
>А если записей в таблице b за сегодняшнюю дату нет или в таблице b вобще нет записей ?

А разве этот запрос не показывает их?

  Ответить  
 
 автор: mastergrom   (11.10.2009 в 15:01)   письмо автору
 
   для: Trianon   (11.10.2009 в 14:49)
 

>А разве этот запрос не показывает их?

Нет, этот запрос не показывает их . Дописал в условии WHERE " OR total = 0", говорит что не знает такого столбца.

  Ответить  
 
 автор: Trianon   (11.10.2009 в 15:47)   письмо автору
 
   для: mastergrom   (11.10.2009 в 15:01)
 

А не показывает он их потому, что подусловие соединения вынесено в общий фильтр - и там, само собой, не выполняется.
SELECT table_a.id, COUNT(table_b.id_count) AS total
  FROM table_a 
      LEFT JOIN table_b 
          ON (table_a.id = table_b.table_a_id AND table_b.date >= CURDATE())
  GROUP BY table_a.id
  HAVING total < 3

  Ответить  
 
 автор: cheops   (11.10.2009 в 15:48)   письмо автору
 
   для: mastergrom   (11.10.2009 в 14:46)
 

Условия для total располагаются в конструкции HAVING. total < 3 подразумевает наличие столбцов с условием total = 0, правда с логикой AND.

  Ответить  
 
 автор: Trianon   (11.10.2009 в 15:57)   письмо автору
 
   для: cheops   (11.10.2009 в 15:48)
 

тут закавыка в том, что WHERE DATE(FROM_UNIXTIME(table_b.date)) ... окажется истинным лишь для тех строк, где table_b.date будет существовать.

  Ответить  
 
 автор: mastergrom   (11.10.2009 в 16:16)   письмо автору
 
   для: Trianon   (11.10.2009 в 15:57)
 

Вобщем, вроде этот вариант работает:
SELECT table_a.id, COUNT(table_b.id_count) AS total
FROM table_a LEFT JOIN table_b ON (table_a.id = table_b.table_a_id)
WHERE table_b.date >= CURDATE() OR (SELECT COUNT(table_b.id_count) as cnt) = 0
GROUP BY table_a.id
HAVING total < 3

  Ответить  
 
 автор: Trianon   (11.10.2009 в 18:33)   письмо автору
 
   для: mastergrom   (11.10.2009 в 16:16)
 

> WHERE table_b.date >= CURDATE() OR (SELECT COUNT(table_b.id_count) as cnt) = 0

вот и помогай после этого...

  Ответить  
 
 автор: mastergrom   (11.10.2009 в 22:58)   письмо автору
 
   для: Trianon   (11.10.2009 в 18:33)
 

>> WHERE table_b.date >= CURDATE() OR (SELECT COUNT(table_b.id_count) as cnt) = 0
>
>вот и помогай после этого...

А что не так ? )

  Ответить  
 
 автор: Trianon   (11.10.2009 в 23:06)   письмо автору
 
   для: mastergrom   (11.10.2009 в 22:58)
 

сложность исполнения запроса выросла на порядок, а так ничего.

  Ответить  
 
 автор: mastergrom   (11.10.2009 в 23:12)   письмо автору
 
   для: Trianon   (11.10.2009 в 23:06)
 

то есть, лучше так:
ON (table_a.id = table_b.table_a_id AND table_b.date >= CURDATE()) 

?
PS и еще вопросик, В другом запросе выбрать из таблицы b записи в которых date больше чем текущая на 30 минут, пробовал в WHERE ставить table_b.date >= table_b.date + $half_hour. Где $half_hour = 60 * 30. Не подскажите как?

  Ответить  
 
 автор: Trianon   (11.10.2009 в 23:19)   письмо автору
 
   для: mastergrom   (11.10.2009 в 23:12)
 

$half_hour = "INTERVAL 30 MINUTE";

только поглядите, что и с чем Вы сравниваете.

  Ответить  
 
 автор: mastergrom   (11.10.2009 в 23:30)   письмо автору
 
   для: Trianon   (11.10.2009 в 23:19)
 

>$half_hour = "INTERVAL 30 MINUTE";
Не находит записей вообще.

>только поглядите, что и с чем Вы сравниваете.

Сравниваю столбец TIMESTAMP со значением этого же столбца + интервал 30 минут. Или нет ?
Впринципе, там запрос громоздкий, довольно-таки, 3 таблицы соеденены. Но если убрать условие с датой то показывает все правильно .. Может как-то преобразовать нужно timestamp в DATE ?

  Ответить  
 
 автор: Trianon   (11.10.2009 в 23:40)   письмо автору
 
   для: mastergrom   (11.10.2009 в 23:30)
 

Ну и какой смысл в неравенстве a >= a + 30 ?
Ясно же, что оно всегда будет ложным.
a - a >= 30
0 >= 30
false

Третий класс, ей-богу.

  Ответить  
 
 автор: mastergrom   (11.10.2009 в 23:45)   письмо автору
 
   для: Trianon   (11.10.2009 в 23:40)
 

>Ну и какой смысл в неравенстве a >= a + 30 ?
>Ясно же, что оно всегда будет ложным.
>a - a >= 30
>0 >= 30
>false
>
>Третий класс, ей-богу.
Да, пора уже наверное спать ложиться ...
Спасибо!

  Ответить  
 
 автор: Trianon   (11.10.2009 в 14:48)   письмо автору
 
   для: cheops   (11.10.2009 в 14:31)
 

Здесь FROM_UNIXTIME явно в кассу. Тип-то не int.
Я бы написал WHERE table_b.date >= CURDATE()

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования