@qlr

Выборка MYSQL из той же таблицы?

Всем привет.
Необходимо было выбрать кол-во объектов по каждому юзеру, такой запрос смог сформулировать:
$statement = $connection->prepare("SELECT DISTINCT(usr.name), usr.id, c.cnt, d.excnt FROM users usr 
LEFT JOIN (SELECT COUNT(*) as cnt, obj.realtor_id FROM objects obj GROUP BY realtor_id) as c ON usr.id=c.realtor_id
LEFT JOIN (SELECT COUNT(*) as excnt, obj.realtor_id FROM objects obj WHERE obj.exclusive=1 GROUP BY realtor_id) as d ON usr.id=d.realtor_id");


Теперь задача усложнилась тем, что у каждого может быть менеджер, который находится в той же таблице (users). Для этого завели переменную managerId.
Теперь нужно вывести те же кол-во объектов, но по каждому менеджеру, а не по юзеру, пробую так:
$statement = $connection->prepare("SELECT DISTINCT(usr1.name), usr1.id, c.cnt, d.excnt FROM users usr1 
LEFT JOIN (SELECT usr.id, usr.manager_id FROM users usr) as b ON usr1.id=b.manager_id
INNER JOIN (SELECT COUNT(*) as cnt, obj.realtor_id FROM objects obj GROUP BY realtor_id) as c ON b.id=c.realtor_id
INNER JOIN (SELECT COUNT(*) as excnt, obj.realtor_id FROM objects obj WHERE obj.exclusive=1 GROUP BY realtor_id) as d ON b.id=d.realtor_id");

но на каждого менеджера приходит несколько записей (т.е. дубли), хотя стоит DISTINCT.

Думаю, что проблема легко исправима, но не могу понять каким образом
  • Вопрос задан
  • 200 просмотров
Пригласить эксперта
Ответы на вопрос 1
idShura
@idShura
Трудно понять структуру и логику работы, но попробую предположить что у менеджеров поле managerId в таблице users будет null.

SELECT USR1.NAME, 
       USR1.ID, 
       C.CNT, 
       D.EXCNT 
  FROM USERS USR1
  LEFT JOIN (SELECT COUNT (*) AS CNT, OBJ.REALTOR_ID 
  	           FROM OBJECTS OBJ 
  	           GROUP BY REALTOR_ID) AS C ON USR.ID = C.REALTOR_ID
  LEFT JOIN (SELECT COUNT (*) AS EXCNT, OBJ.REALTOR_ID 
  	           FROM OBJECTS OBJ WHERE OBJ.EXCLUSIVE = 1 
  	           GROUP BY REALTOR_ID) AS D ON USR.ID = D.REALTOR_ID;
 WHERE MANAGER_ID IS NULL
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы