Вставить, если поле последней строки соответствует предложению или результат подзапроса равен 0 - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь получить одну вставку, которая применяет следующее

______________________________
| id | item (fk) | condition |
| 1  | 3         | NEW       |
| 2  | 3         | USED      |
| 3  | 2         | USED      |
______________________________

Я пытаюсь добиться следующего:

Учитывая идентификатор элемента = 3, например, яхотел бы вставить новые строки в эту таблицу, если выполняется одно из этих двух условий:

  1. строка с наибольшим идентификатором не является "NEW" `
  2. countзаписей этого элемента (id = 3): equal to 0

Ближайшее, что я получил на данный момент, было:

INSERT INTO tableA (item, condition)
        SELECT (itemId, "NEW")  FROM ( 
                    SELECT condition, count(*) as rowCount
                    FROM tableA 
                    WHERE item = itemId 
                    ORDER BY id DESC LIMIT 1 ) a
            WHERE a.condition <> "NEW" OR a.rowCount = 0;

Но счет (*) портится сзаказываю .. Любая подсказка?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Вам нужен подзапрос, который получает строку с наибольшим идентификатором для этого item:

SELECT condition
FROM tableA
WHERE item = 3
ORDER BY id DESC
LIMIT 1

Если для этого item нет строк, этот подзапрос вернет NULL.Вы можете использовать нулевой оператор равенства, чтобы справиться с этим.

INSERT INTO tableA (item, condition)
SELECT 3, "NEW"
FROM DUAL
WHERE NOT (
    SELECT condition
    FROM tableA
    WHERE item = 3
    ORDER BY id DESC
    LIMIT 1
) <=> "NEW"
0 голосов
/ 27 сентября 2018

Я думаю об этом как о подзапросе агрегации без GROUP BY.Это всегда возвращает ровно одну строку, поэтому у вас все равно будет строка, даже если cnt равно 0:

INSERT INTO tableA (item, condition)
    SELECT a.itemId, a.condition
    FROM (SELECT @itemId as itemId, 'NEW' as condition,
                 COUNT(*) as cnt,
                 MAX(id) as max_id,
                 MAX(CASE WHEN condition = 'NEW' THEN id END) as max_new
          FROM tableA
          WHERE item = @itemId
         ) a
    WHERE cnt = 0 OR max_new is null or max_new < max_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...