3

私は3つのMySQLテーブルを持っています:

patient:
    paID, paCode, paAccountID (foreign key)

test
    tsID, tsName, tsPatientID (foreign key), tsAccountID (foreign key)

account
    acID etc.

ここで、特定のにリンクされているpaID数とその数を数えたいと思います。にリンクされている6と4があります。tsIDacID=1tsIDpaIDacID=1

SELECT Count(paID) AS paCount FROM patient WHERE paAccountID=1
SELECT Count(tsID) AS tsCount FROM test WHERE tsAccountID=1

両方を1つのクエリにまとめようとしました...

SELECT Count(tsID) AS tsCount, Count(paID) AS paCount
FROM test LEFT JOIN patient ON tsPatientID = paID 
WHERE tsAccountID=1 

そのように機能しません、両方のカウントは6を返します。それを正しくする方法は?

4

3 に答える 3

4

tsIdとpaIdが一意のキーであると仮定すると、これは機能するはずです。

SELECT Count(DISTINCT t.tsID) AS tsCount, 
    Count(DISTINCT p.paID) AS paCount
FROM account a 
    LEFT JOIN test t ON a.acId = t.tsAccountId
    LEFT JOIN patient p ON a.acId = p.paAccountId
WHERE a.acId = 1

そして、これがSQLFiddleです。

注意:アカウントテーブルに参加しない(そしてマスターテーブルとして使用する)場合の問題は、テストテーブルまたは患者テーブルのいずれかに特定のアカウントIDのデータがない場合、クエリはそれぞれに0の結果を返すことです- -これは正しくない可能性があります。

于 2013-02-17T00:19:27.620 に答える
0
SELECT
    COUNT(DISTINCT tsID) AS tsCount,
    COUNT(DISTINCT paID) AS paCount
FROM
    test
    CROSS JOIN patient
WHERE
    tsAccountID = 1
    AND paAccountID = 1
于 2013-02-17T00:19:24.027 に答える
-1

joinメソッドは関連するすべての行を返すため、countは常に返されたすべての行の数を返します

このような場合、メインのselectクエリ内で(select count(*)from [Table] Where [id = x])as [tsCount])をフィールドとして使用します。

于 2013-02-17T00:22:36.970 に答える