|
|
|
| Добрый день, такой вопрос
есть две таблицы:
table_a:
id
(ну и другие стоблбцы)
И table_b:
id
table_a_id
date (тип TIMESTAMP)
и другие стоблбцы)
--------------
Необходимо получить id из таблицы table_a и количество записей этого id из таблицы b, как скажем id_count, которых в таблице table_b либо нет за сегодняшнюю дату, или количество записей за сегодняшнюю дату в таблице b меньше трех. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: 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
|
Попробую ....
Спасибо за наводку ) | |
|
|
|
|
|
|
|
для: mastergrom
(11.10.2009 в 14:46)
| | >То есть, это только если есть записи за сегодняшнюю дату, получается..
>А если записей в таблице b за сегодняшнюю дату нет или в таблице b вобще нет записей ?
А разве этот запрос не показывает их? | |
|
|
|
|
|
|
|
для: Trianon
(11.10.2009 в 14:49)
| | >А разве этот запрос не показывает их?
Нет, этот запрос не показывает их . Дописал в условии WHERE " OR total = 0", говорит что не знает такого столбца. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: mastergrom
(11.10.2009 в 14:46)
| | Условия для total располагаются в конструкции HAVING. total < 3 подразумевает наличие столбцов с условием total = 0, правда с логикой AND. | |
|
|
|
|
|
|
|
для: cheops
(11.10.2009 в 15:48)
| | тут закавыка в том, что WHERE DATE(FROM_UNIXTIME(table_b.date)) ... окажется истинным лишь для тех строк, где table_b.date будет существовать. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: mastergrom
(11.10.2009 в 16:16)
| | > WHERE table_b.date >= CURDATE() OR (SELECT COUNT(table_b.id_count) as cnt) = 0
вот и помогай после этого... | |
|
|
|
|
|
|
|
для: Trianon
(11.10.2009 в 18:33)
| | >> 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 в 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. Не подскажите как? | |
|
|
|
|
|
|
|
для: mastergrom
(11.10.2009 в 23:12)
| | $half_hour = "INTERVAL 30 MINUTE";
только поглядите, что и с чем Вы сравниваете. | |
|
|
|
|
|
|
|
для: Trianon
(11.10.2009 в 23:19)
| | >$half_hour = "INTERVAL 30 MINUTE";
Не находит записей вообще.
>только поглядите, что и с чем Вы сравниваете.
Сравниваю столбец TIMESTAMP со значением этого же столбца + интервал 30 минут. Или нет ?
Впринципе, там запрос громоздкий, довольно-таки, 3 таблицы соеденены. Но если убрать условие с датой то показывает все правильно .. Может как-то преобразовать нужно timestamp в DATE ? | |
|
|
|
|
|
|
|
для: mastergrom
(11.10.2009 в 23:30)
| | Ну и какой смысл в неравенстве a >= a + 30 ?
Ясно же, что оно всегда будет ложным.
a - a >= 30
0 >= 30
false
Третий класс, ей-богу. | |
|
|
|
|
|
|
|
для: Trianon
(11.10.2009 в 23:40)
| | >Ну и какой смысл в неравенстве a >= a + 30 ?
>Ясно же, что оно всегда будет ложным.
>a - a >= 30
>0 >= 30
>false
>
>Третий класс, ей-богу.
Да, пора уже наверное спать ложиться ...
Спасибо! | |
|
|
|
|
|
|
|
для: cheops
(11.10.2009 в 14:31)
| | Здесь FROM_UNIXTIME явно в кассу. Тип-то не int.
Я бы написал WHERE table_b.date >= CURDATE() | |
|
|
|