Необходимо перенести некоторые ограничения в предложении WHERE
в предложение ON
:
SELECT
c.datefield,
COUNT(f.booking_date) AS cnt
FROM calendar c
LEFT JOIN final_registration f
ON c.datefield = DATE(f.booking_date) AND
f.event_id = '101'
WHERE
c.datefield BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01') AND CURDATE()
GROUP BY
c.datefield;
[1113 ] Демонстрация
Обратите внимание, что вы хотите сосчитать поле из таблицы final_registration
, которая появляется справа от левого соединения.
Задержка в моем ответе была из-за очистки вашего запроса, чтобы удалить все ненужные вызовы на DATE_FORMAT
. Вы должны иметь возможность иметь дело непосредственно с datefield
. Что касается предложения WHERE
, то, похоже, вам просто нужны даты, которые находятся в текущем месяце, но не позднее текущего дня месяца.
Хорошо можно сделать это со станд.:: вектор также.
В обоих случаях стирание берет итератор в качестве параметра.
Таким образом, прежде чем можно стереть что-то из вектора (или ptr_vector), необходимо определить местоположение его.
Также обратите внимание, что ptr_vector рассматривает свое содержание, как будто Вы хранили объект не указатель. Таким образом, любой поиск сделан через объект.
Так в основном
std::vector<A> x;
std::ptr_vector<A> y;
// These two object should behave in exactly the same way.
// The ONLY difference is inserting values which for y are pointers.
// Y take ownership of the pointer and all subsequent acesses to the
// members of y look like they are objects
Пример:
#include <boost/ptr_container/ptr_vector.hpp>
#include <vector>
class A
{ int m;
public:
A(int x):m(x) {}
bool operator==(A const& rhs) {return m = rhs.m;}
};
int main()
{
boost::ptr_vector<A> x;
x.push_back(new A(1));
x.erase(std::find(x.begin(),x.end(),A(1)));
std::vector<A> y;
y.push_back(A(2));
y.erase(std::find(y.begin(),y.end(),A(2)));
// To find an exact pointer don't modify the equality.
// Use find_if and pass a predicate that tests for a pointer
A* a = new A(3);
boost:ptr_Vector<A> z;
z.push_back(a);
z.erase(std::find_if(y.begin(),y.end(),CheckPointerValue(a));
}
struct CheckPointerValue
{
CheckPointerValue(A* a):anA(a) {}
bool operator()(A const& x) { return &X == anA;}
private:
A* anA;
};
Я думаю, что Вы хотите назвать .release () на векторе вместо стирания. Это удаляет запись и удаляет память.
Посмотрите раздел "New Functions" для деталей в учебном руководстве или проверьте ссылку.
С другой стороны, необходимо получить итератор к элементу для вызова стирания (), я ot уверенный* количества с точки зрения ptr_vector.
Можно использовать шаблонный метод erase_if.
vec.erase_if( predicate() );
Семантика ptr_vector
очень похожи на постоянного клиента vector
. Необходимо найти элемент, прежде чем можно будет стереть его.
Любопытная вещь: STL:: вектор <> является Контейнером Произвольного доступа, означая, что он использует Итераторы Произвольного доступа.
Так vec.erase (vec.begin () +N) удалит элемент в индексе N.
Обратите внимание, что выполнение так повреждает целый мем итератора, и Вы больше не можете тривиально переключаться между векторами и списками...
Необходимо использовать участника erase_if метод с подходящим предикатом. Нет никакой потребности удалить указатель, контейнер имеет владение.
struct delete_a {
bool operator()(boost::ptr_vector<A>::value_type inA) {
return inA == a;
}
}
vec.erase_if(delete_a());
(обратите внимание, что это - просто пример, выбранный для простоты для такой ситуации в реальном коде, я предполагаю, что можно было бы записать подходящую bind/equal_to комбинацию или лямбду использования),
Или, как альтернатива, разъединение вызова на корректном итераторе, если Вы все еще хотите использовать объект.