2015-04-27 2 views
-2

У меня возникли проблемы с подсчетом соответствующих контактов, сайтов и devis клиента в моей базе данных.Оператор SQL для подсчета соответствующих записей

Мои таблицы:

TABLE Devis 
idDevis (PK) 
idSiteClient (FK) 

TABLE SiteClient 
idSiteClient (PK) 
idClient (FK) 

TABLE Client 
    idClient (PK) 

TABLE Contact 
    idContact (PK) 
    idClient (FK) 

Моего текущее утверждение

$requete = myPDO::getInstance()->prepare(<<<SQL 
     SELECT COUNT(sc.idSiteClient), COUNT(dvs.idDevis), COUNT(ct.idContact) 
     FROM SiteClient sc, Devis dvs, Client clt, Contact ct 
     WHERE dvs.idSiteClient = sc.idSiteClient 
     AND sc.idClient = clt.idClient 
     AND clt.idClient = ct.idClient 
     AND clt.idClient = :id 
SQL 
); 

    $requete->execute(array(":id" => $id)); 

Но это дает мне 15, 15, 15, что неправильно, я должен иметь 5 Сайта, 2 Devis и 5 контакта

спасибо за помощь

+0

Вы рассчитываете количество строк из JOIN здесь. (Удалите COUNT и выполните тот же выбор и посмотрите, что вы получите.) – jarlh

+0

[{«idSiteClient»: «1», «idDevis»: «14», «idContact»: «3»}] не попадают туда он исходит от – xNeyte

+0

Просто сделал, дал 2, 3, 5 – xNeyte

ответ

1

использовать это:

WITH 
    clt1 AS (SELECT * FROM Client clt WHERE clt.idClient = :id), 
    ct1 AS (SELECT COUNT(*) cnt, ct.* FROM Contact ct JOIN clt1 ON clt1.idClient = ct.idClient), 
    sc1 AS (SELECT COUNT(*) cnt, sc.* FROM SiteClient sc JOIN clt1 ON clt1.idClient = sc.idClient), 
    dvs1 AS (SELECT COUNT(*) cnt, dvs.* FROM Devis dvs JOIN sc1 ON sc1.idSiteClient = dvs.idSiteClient) 
SELECT DISTINCT NVL(sc1.cnt, 0), NVL(dvs1.cnt, 0), NVL(ct1.cnt, 0) 
FROM sc1, dvs1, ct1 
0

Try с Distinct

SELECT COUNT(distinct sc.idSiteClient), 
     COUNT(distinct dvs.idDevis), COUNT(distinct ct.idContact) 
    FROM SiteClient sc, Devis dvs, Client clt, Contact ct 
    WHERE dvs.idSiteClient = sc.idSiteClient 
    AND sc.idClient = clt.idClient 
    AND clt.idClient = ct.idClient 
    AND clt.idClient = :id 
+0

Это дает мне 2, 3, 5 – xNeyte

+0

, он не будет работать правильно e. г. когда нет dvs (вы получите 0,0,0) –

0

вы можете попробовать этот

SELECT 
cl.idClient, 
sc.SiteNo, 
con.ContactNo, 
dev.DevisNo 

FROM Client cl 
    LEFT JOIN (SELECT COUNT(distinct idClient) AS SiteNo, idClient, idSiteClient FROM SiteClient GROUP BY idClient, idSiteClient) sc ON cl.idClient = st.idClient 
    LEFT JOIN (SELECT COUNT(*) AS ContactNo, idClient FROM Contact GROUP BY idClient) con ON cl.idClient = con.idClient 
    LEFT JOIN (SELECT COUNT(*) AS DevisNo, idSiteClient FROM Devis GROUP BY idSiteClient) dev ON sc.idSiteClient = dev.idSiteClient 
WHERE 
cl.idClient = :id 
+0

, есть проблема только с 3-м LEFT JOIN, потому что клиент не имеет прямого отношения к Devis, есть SiteClient между – xNeyte

+1

, чем вам нужно исправить свой вопрос и дать me подробнее о дизайне таблицы –

+0

Попробуйте сейчас Я обновляю свой запрос –

Смежные вопросы