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,并且日期时间戳小于今天(将其从结果中删除)。

将两个结果合并到一个查询中的任何想法

注意事项(如果这有所不同):

  • field_a 可以有一个值 az,1-99(只有两个字符)
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

这是一个应该工作的代码:

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)witha.field_1 <=4a.field_1 NOT IN (1,2,3,4)witha.field_1 > 4

如果有大型记录集有问题,这将使其更快

于 2011-06-30T17:19:16.290 回答
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 IS NULL,则表达式“foo NOT IN (blah)”返回 NULL。所以你需要更具体地说明这一点。

于 2011-06-30T19:19:50.960 回答