1

1 つのクエリでこれを実行できるかどうかはわかりませんが、実行したいと思います。

次のようなすべてのレコードが必要です。

SELECT a.field_1, a.field_2, b.field_3, b.field_4
  FROM tbl_a AS a, tbl_b AS b
 WHERE a.field_1 = b.field_3

また、この条件に該当するレコードも除外したいと思います。

IF a.field_1 IN (1,2,3,4) 
AND a.field_date < NOW()

更新:(混乱して申し訳ありません)

  • したがって、field_1 が 1、2、3、または 4 に等しく、日付のタイムスタンプが今日の場合、レコードを表示する必要があります (結果に追加)。
  • また、field_1 が 1、2、3、または 4 に等しく、日付のタイムスタンプが今日よりも小さい場合 (結果から削除します)。

両方の結果を 1 つのクエリにまとめるアイデア

注(これが違いを生む場合):

  • field_a の値は a ~ z、1 ~ 99 (2 文字のみ) です。
4

3 に答える 3

2

このようなもの?

SELECT a.field_1, a.field_2, b.field_3, b.field_4
FROM tbl_a AS a, tbl_b AS b
WHERE a.field_1 = b.field_3
AND (
CASE WHEN a.field_1 IN (1,2,3,4) THEN
      CASE WHEN A.FIELD_DATE = NOW() THEN 1 ELSE 0
      END
ELSE 1
END) = 1
于 2011-06-30T17:12:42.583 に答える
0

これを適切な JOIN で書き直して、除外する条件に NOT を追加しましょう。

SELECT a.field_1, a.field_2, b.field_3, b.field_4
  FROM tbl_a AS a JOIN tbl_b AS b ON (a.field_1 = b.field_3)
WHERE NOT (a.field_1 IN (1,2,3,4) AND a.field_date < NOW())

NOT( X AND Y ) は (NOT X) OR (NOT Y) と同等であるため、次のように書き換えることができます。

SELECT a.field_1, a.field_2, b.field_3, b.field_4
  FROM tbl_a AS a JOIN tbl_b AS b ON (a.field_1 = b.field_3)
WHERE a.field_1 NOT IN (1,2,3,4) OR a.field_date >= NOW())

ただし、field_1 または field_date のいずれかが NULL になる可能性があるかどうかも知る必要があります。その場合、"foo NOT IN (blah)" という式は、foo が NULL の場合に NULL を返します。したがって、それについてより具体的に説明する必要があります。

于 2011-06-30T19:19:50.960 に答える
0

動作するはずのコードは次のとおりです。

SELECT a.field_1, a.field_2, b.field_3, b.field_4
FROM tbl_a AS a
INNER JOIN tbl_b AS b ON a.field_1 = b.field_3
WHERE 
(a.field_1 IN (1,2,3,4) AND a.field_date = NOW())
OR
(a.field_1 NOT IN (1,2,3,4))

a.field が unsigned int != 0 の場合、次のように置き換えることができることに注意し てa.field_1 IN (1,2,3,4)くださいa.field_1 <=4a.field_1 NOT IN (1,2,3,4)a.field_1 > 4

これにより、大きなレコードセットが問題になっている場合に高速になります

于 2011-06-30T17:19:16.290 に答える