2009-07-01 14 views
0

友人は、各モデルの何個のピース​​が毎月売られたかを示すクエリを作成するのを助けてくれました。たとえその日にいかなるモデルのアイテムも販売されていなくても、特定の日。私は以下の質問を思いついたが、期待どおりに動いていない。私は販売されたモデルのレコードを取得しているだけなので、理由はわかりません。クエリの左と右の結合

select days_of_months.`Date`, 
     m.NAME as "Model", 
     count(t.ID) as "Count" 
    from MODEL m 
    left join APPLIANCE_UNIT a on (m.ID = a.MODEL_FK and a.NUMBER_OF_UNITS > 0) 
    left join NEW_TICKET t on (a.NEW_TICKET_FK = t.ID and t.TYPE = 'SALES' 
and t.SALES_ORDER_FK is not null) 
right join (select date(concat(2009,'-',temp_months.id,'-',temp_days.id)) as "Date" 
       from temp_months 
       inner join temp_days on temp_days.id <= temp_months.last_day 
       where temp_months.id = 3 -- March 
      ) days_of_months on date(t.CREATION_DATE_TIME) = 
date(days_of_months.`Date`) 
group by days_of_months.`Date`, 
     m.ID, m.NAME 

私は、任意の月のすべての日を取得するために、一時テーブルtemp_monthstemp_daysを作成していました。私はMySQL 5.1を使用していますが、ANSI準拠のクエリを作成しようとしています。

答えて

6

あなたが何で毎日、モデルのペアのために、正確に一つのレコードを持っているように、あなたがあなたの日付とモデルをCROSS JOINする必要があり、その後、LEFT JOIN他のテーブル:

SELECT date, name, COUNT(t.id) 
FROM (
     SELECT ... 
     ) AS days_of_months 
CROSS JOIN 
     model m 
LEFT JOIN 
     APPLIANCE_UNIT a 
ON  a.MODEL_FK = m.id 
     AND a.NUMBER_OF_UNITS > 0 
LEFT JOIN 
     NEW_TICKET t 
ON  t.id = a.NEW_TICKET_FK 
     AND t.TYPE = 'SALES' 
     AND t.SALES_ORDER_FK IS NOT NULL 
     AND t.CREATION_DATE_TIME >= days_of_months.`Date` 
     AND t.CREATION_DATE_TIME < days_of_months.`Date` + INTERVAL 1 DAY 
GROUP BY 
     date, name 

あなたがそれを行う方法は、今あなたがNULLを取得売上がない日はmodel_idにあり、グループ化されています。

JOIN条件:

AND t.CREATION_DATE_TIME >= days_of_months.`Date` 
AND t.CREATION_DATE_TIME < days_of_months.`Date` + INTERVAL 1 DAY 

代わりにこれは、クエリsargable

+0

特定の結合を行う必要はありません。 私はmysqlに慣れていませんが、SQL Serverではinner/outerを省略した場合はinnerをデフォルトにします。 –

+1

@dan s:LEFTとRIGHTはOUTERを意味します。 – Quassnoi

+0

これは私の問題を解決しました。どうもありがとう! –

0

あなたは外部結合を使用する必要があります(インデックスによって最適化)を作るように役立つ

DATE(t.CREATION_DATE_TIME) = DATE(days_of_months.`Date`) 

の彼ら結合された2つのテーブルの各レコードが一致するレコードを持つ必要はありません。

http://dev.mysql.com/doc/refman/5.1/en/join.html

+0

クエリを読むと、私はすでに左右の外部結合を使用していることがわかります。 –

0

あなたはOUTER参加を探しています。左側の外部結合は、右側に結合するレコードがなくても、結合の左側からのレコードを含む結果セットを作成します。右外側結合は反対方向にも同じことを行い、左側に対応するレコードがない場合でも右側のテーブルのレコードを作成します。レコードを持たないテーブルから投影された列は、結合結果にNULL値を持ちます。

関連する問題