2012-01-22 6 views
0

2つのソースからの日付でグループ化されたカウントされた列を選択する必要があります。私はサブクエリとして結果セットに参加しています。しかし、結果は偽です。私が見ているように、問題はJOIN .. ON節に関連しています。このクエリは正常に動作します:何らかの形で参加しましたサブクエリでa.idを使用することが可能であるサブクエリーが結合された列スコープ

SELECT id 
FROM pu a 
LEFT JOIN (
    SELECT 
     COUNT(pd.id) AS c_id1, 
     NULL AS c_id2, 
     LEFT(pd.start_date, 10) AS date, 
     pd.pid 
    FROM 
     p_d pd 
    GROUP BY date 

    UNION 

    SELECT 
     NULL AS c_id1, 
     COUNT(pd.id) AS c_id2, 
     LEFT(pd.inactivation_date, 10) AS date, 
     pd.pid 
    FROM 
     p_d pd 
    GROUP BY date 
) x 
ON x.pid = a.id; 

SELECT id 
FROM pu a 
LEFT JOIN (
    SELECT 
     COUNT(pd.id) AS c_id1, 
     NULL AS c_id2, 
     LEFT(pd.start_date, 10) AS date, 
     pd.pid 
    FROM 
     p_d pd 
    **WHERE pd.pid = 111** 
    GROUP BY date 

    UNION 

    SELECT 
     NULL AS c_id1, 
     COUNT(pd.id) AS c_id2, 
     LEFT(pd.inactivation_date, 10) AS date, 
     pd.pid 
    FROM 
     p_d pd 
    **WHERE pd.pid = 111** 
    GROUP BY date 
) x 
ON x.pid = a.id; 

しかし、(WHERE句なし)この1つは悪い結果セットを返しますか?今は「未知の列」です。

+0

後者の結果はどうですか?あなたが期待している結果を第2に推測するのは少し難しいです。 –

+0

Joachim、2番目のクエリは、偽の番号を持つ最初の3〜4行(日付)のみを返します。最初の行は、すべての行(この場合〜80)を適切な数で返します。 – Eduard7

答えて

2

サブクエリでpd.pidSELECT)の列はGROUP BYの一部ではなく、集計されていません。このような列はhiddenと呼ばれ、標準のSQLでは構文エラーが発生しますが、mysqlはそれを許可しますが、すべてのグループの任意の行から値を自由に選択できます。

WHERE pd.pid = 111で設定した場合、グループ内のすべてのpd.pidの値は同じになるので、どの行を取得するかは関係ありませんが、WHEREの値はpd.pidになりますundefined(mysqlはおそらくあなたを最速にフェッチできるものを選択します)。あなたはまた、JOINのためにその未定義のPIDを使用するので、間違った結果を得ることになります。

http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html

それは、あなたがテーブルスキーマに関する十分な情報を提供しないよう、あなたのクエリを書き直す必要がありますがどのように言うのは難しいです何を達成しようとしているとあなたのテーブル/列名の意味は何ですか。

+0

その答えは私を啓発した、私の全体的なアプローチは悪かった。クエリの改訂を完了しただけで、ありがとう。 – Eduard7

関連する問題