@ingwar4ik

Как написать правильно sql запрос?

Здравствуйте. Есть задача, нужно получить количество записей по статусах,
а также можно было получать результат для одного пользователя, или несколько пользователей.

таблица: Statuses
idcustomer_idstatus_name
11New
21In progress
31closed

таблица: Products
idcustomer_iduser_idstatusmodified
111New2015-08-10
2133New2015-08-25
3154closed2015-09-01


Ожидаемый результат
idcustomer_idstatus_namecount
11New2
21In progress0
31closed1


Я написал такой запрос, но на выходе получаю count 0(во всех статусах) если указать несколько пользователей, для одного пользователя результат есть.
Может кто то подскажет что я сделал не так.
$usersArr= array(66,1,33,54);

SELECT s.status_name, count(p.status) as count from statuses as s
left join products as p ON (p.status = s.status_name p.modified BETWEEN "2015-08-10" AND "2015-09-10"  and p.user_id = $usersArr)
where s.customer_id = 1 
group by s.status_name
  • Вопрос задан
  • 621 просмотр
Решения вопроса 1
nikitasius
@nikitasius
Выборка по всем кастомер_ид, чтобы уточнить - добавьте where p.user_id=33 для юзера и/или where p.customer_id=2 для кастомера.
Такая выборка НЕ выводит нулевые поля.
select p.customer_id, p.`status`, count(p.id)
from 247250_Products p
group by p.customer_id, p.`status`

Результат:
sql_247250_1_1b10d020f1eaa6f9.png

Выборка, которая выведет и нулевое значение:
select s.customer_id, s.status_name,
IFNULL((select count(id) from 247250_Products p where p.`status`= s.status_name),0) as 'count'
from 247250_Statuses s

Результат:
sql_247250_2_cc195f18347ecc15.png
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@heartdevil
плыву как воздушный шарик
Привет

Попробуйте так

$userArr = implode(",", $array(66,1,33,54));

SELECT s.id, s.customer_id, s.status, COUNT(s.status) AS count
FROM statuses AS s
INNER JOIN products AS p ON (p.status = s.status_name)
WHERE s.customer_id = 1 AND p.modified BETWEEN "2015-08-10" AND "2015-09-10"  AND p.user_id IN ($userArr)
GROUP BY s.status
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы