2

行間のギャップを埋めるにはどうすればよいですか? 卓上カレンダーを使用していますが、クエリが正しくないようです。結果はギャップを示していません..

SELECT calendar.datefield, t2.*
    FROM store_relation t1,store t3, store_product t2
            RIGHT JOIN calendar ON (DATE(t2.created) = calendar.datefield)
            WHERE (calendar.datefield BETWEEN ('2012-07-15') and ('2012-07-20'))
    AND t1.id_store_a = 1
    AND t1.id_store_b = t2.id_store
    AND t3.id = t2.id_store
    AND t2.id_product = 11
    ORDER By t2.price

結果:

datefield   |   id_product   |   id_store   |   created
2012-07-15      1                1              2012-07-15
2012-07-18      1                1              2012-07-18
2012-07-20      1                1              2012-07-20
2012-07-20      1                1              2012-07-20

結果待ってました

datefield   |   id_product   |   id_store   |   created
2012-07-15      1                1              2012-07-15
2012-07-16      null             null           null
2012-07-17      null             null           null
2012-07-18      1                1              2012-07-18
2012-07-19      null             null           null
2012-07-20      1                1              2012-07-20
2012-07-20      1                1              2012-07-20
4

3 に答える 3

2

LEFT/RIGHT JOIN があり、オプションで含まれるテーブルをフィルタリングしている場合、WHERE句はそれらのレコードを除外します。RIGHT JOIN欠落している左側の部分を許可する条件を含める必要があります。

WHERE (calendar.datefield BETWEEN ('2012-07-15') and ('2012-07-20'))
AND
(
   (t1.id_store_a = 1
   AND t1.id_store_b = t2.id_store
   AND t3.id = t2.id_store
   AND t2.id_product = 11)
   OR
   (t2.id_product is NULL)
)

たとえば、期待される出力を見ると、 の値id_productは null ですが、 をフィルタリングしていますt2.id_product = 11。そのため、nullレコードが一致することは決してない11ため、除外されています。

于 2012-07-26T18:17:23.027 に答える
1

WHERE句の左側にある列の一部を参照しています。条件を明示的に追加してみてくださいOR NULL。例えば:

SELECT calendar.datefield, t2.*
FROM store_relation t1,store t3, store_product t2
        RIGHT JOIN calendar ON (DATE(t2.created) = calendar.datefield)
        WHERE (calendar.datefield BETWEEN ('2012-07-15') and ('2012-07-20'))
AND ((t1.id_store_a = 1
        AND t1.id_store_b = t2.id_store
        AND t3.id = t2.id_store
        AND t2.id_product = 11)
    OR (t1.id IS NULL AND t2.id IS NULL AND t3.id IS NULL))
ORDER By t2.price

null を許可するテーブルを決定する必要があります。

于 2012-07-26T18:17:39.350 に答える
0

わかった...新しいアイデアをくれてありがとう

SELECT calendar.datefield as DATE, t2.*
FROM store_relation t1,store t3, store_product t2
    RIGHT JOIN calendar ON (DATE(t2.created) = calendar.datefield)
    WHERE (calendar.datefield BETWEEN ('2012-07-15') and ('2012-07-27'))
AND ((t1.id_store_a = 1
    AND t1.id_store_b = t2.id_store
    AND t3.id = t2.id_store
    AND t2.id_product = 11)
OR (t2.id_product IS NULL))
GROUP BY DATE
于 2012-07-26T18:51:50.350 に答える