Объединить два запроса в один - PullRequest
1 голос
/ 30 июня 2011

Я не уверен, смогу ли я сделать это в одном запросе, но мне бы хотелось.

Мне нужны все записи, подобные этой:

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 (только два символа)

Ответы [ 3 ]

2 голосов
/ 30 июня 2011

Как то так?

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
0 голосов
/ 30 июня 2011

Давайте перепишем это с правильным 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 и Y) эквивалентно (NOT X) ИЛИ (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)" возвращает NULL, если foo IS NULL. Так что вам нужно быть более конкретным об этом.

0 голосов
/ 30 июня 2011

вот код, который должен работать:

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

это ускорит работу в случае, если речь идет о большом наборе записей

...