Başka bir sütuna alınan değer sayıları () görüntülemek için SQL kod

2 Cevap php

Üç tablo (bunlar ilgili sütunlar vardır):

Table1
bookingid, person, role


Table2
bookingid, projectid


Table3
projectid, project, numberofrole1, numberofrole2

"Role1" veya "role2": Table1.role iki değer alabilir.

Ne yapmak istiyorum don't Tablo1'e rolleri doğru sayıda projeleri hangi göstermektir. Orada her rol için orada olmalı rolleri sayısı Çizelge 3'te olduğunu.

Örneğin, Tablo 1 bu üç satır içeriyor:

bookingid, person, role
7, Tim, role1
7, Bob, role1,
7, Charles, role2

ve Table2

bookingid, projectid
7, 1

ve Table3

projectid, project, numberofrole1, numberofrole2
1, Test1, 2, 2

Ben sonuç role2s doğru sayıda proje için orada olmadığını göstermek istiyorum Test1.

Dürüst olmak gerekirse, böyle bir şey biraz benim yeteneği ötesinde, bu yüzden bunu yapmak için en iyi yolu önerilere açığım. Ben sqlite ve php (sadece küçük bir proje var) kullanıyorum. Benim sonuçlar var bir kere ben sonunda php ile bir şeyler yapmak varsayalım, ama sqlite ile bunu yapmak için daha iyi bir yolu olup olmadığını merak ettim.

Ben böyle bir şey yaparak başladı:

SELECT project, COUNT(numberofrole1) as "Role"
FROM Table1
JOIN Table2
USING (projectid)
JOIN Table3
USING (bookingid)
WHERE role="role1"
GROUP BY project

Ama değeri numberofrole1 aldığı ile "Rolü" olarak döndürülen değeri karşılaştırmak için nasıl çalışmak değil

Herhangi bir yardım minnetle alınır.

2 Cevap

Bu deneyin:

Select * From Table3 t3
Where (Select Count(*) From Table1 t1r1
          Join Table2 t2r1 On t2r1.bookingid = t1r1.bookingid
       Where t2r1.projectid = t3.ProjectId
          And role = 'role1') <>  numberofrole1 
     Or
     (Select Count(*) From Table1 t1r2
          Join Table2 t2r2 On t2r2.bookingid = t1r2.bookingid
       Where t2r2.projectid = t3.ProjectId
          And role = 'role2') <>  numberofrole2

hatta daha iyi, eğer o inşaat ... (bunu deneyin)

Select * From Table3 t3
Where Exists 
      (Select * From Table1 t1r1
          Join Table2 t2r1 
               On t2r1.bookingid = t1r1.bookingid
       Where t2r1.projectid = t3.ProjectId
       Group By Role
       Having Sum(Case Role When 'role1' Then 1 Else 0 End) 
                              = t3.numberofrole1
          And Sum(Case Role When 'role2' Then 1 Else 0 End)  
                              = t3.numberofrole2 ) 

Böyle bir şey deneyin:

SELECT
    projectid, 
    numberofrole1,
    numberofrole2,
    SUM(role='role1') as actual_numberofrole1,
    SUM(role='role2') as actual_numberofrole2
FROM table3
JOIN table2
    USING (projectid)
JOIN table1
    USING (bookingid)
GROUP BY projectid
HAVING numberofrole1 <> actual_numberofrole1
    OR numberofrole2 <> actual_numberofrole2