MySQL - SELECT для возврата идентификаторов из той же таблицы в подвыбор - PullRequest
0 голосов
/ 16 апреля 2020

Проблема, которую необходимо решить, следующая:

  1. Все идентификаторы, где matrix_id одинаковы, а задача отношения с stage_id = 1 выполнена = true и current_phase = 5

  2. И все идентификаторы, где deviation_id одинаковы, и задача с stage_id = 1 и complete = true и current_phase = 5

  3. Все идентификаторы, где stage = 2 и current_phase - [ 2,3 или 4] и complete = false (Sorted)
  4. Как только они вернут данные правильно, мне нужно сделать для них один запрос, чтобы он возвращал все идентификаторы для всех трех запросов

Пример данных и запросов https://www.db-fiddle.com/f/iWC2SrAmV8nKZNR9dqU5Qm/3

Я бы сказал, что у Кирса Крингла было очень хорошее решение, но в нем по-прежнему не хватает нескольких вещей.

  1. Первый запрос возвращает два элемента, второй (ID # 4) с stage_id = 1 завершен, но не находится в current_phase = 5, поэтому он не должен возвращаться
  2. То же происходит со вторым запросом, где второй элемент должен не возвращается, поскольку его задача взаимосвязи на этапе 1 отсутствует в current_phase = 5
  3. Третий запрос уже в порядке.
  4. Это должен быть один запрос со всеми тремя запросами вместе.

1 Ответ

1 голос
/ 16 апреля 2020

Вопрос очень сложный для понимания. Я сделал все, что мог, используя предоставленную вами информацию.


Я использовал следующее для создания таблицы во втором показанном примере (ни в коем случае вы не должны использовать это для вашей реальной схемы таблицы. это вместе быстро):

CREATE DATABASE IF NOT EXISTS TEST; 
CREATE TABLE IF NOT EXISTS TEST.test_table (
    ID INT AUTO_INCREMENT PRIMARY KEY,
    SYSTEM_ID INT(10) NOT NULL,
    TYPE_ID INT(10) NOT NULL,
    STAGE_ID INT(10) NOT NULL,
    CURRENT_PHASE INT(10) NOT NULL,
    COMPLETE BOOLEAN,
    MATRIX_ID INT(10),
    DEVIATION_ID INT
);
INSERT INTO TEST.test_table (ID,SYSTEM_ID,TYPE_ID,STAGE_ID,CURRENT_PHASE,COMPLETE,MATRIX_ID,DEVIATION_ID)
VALUES
  (NULL,1,1,1,5,true,1,NULL),
  (NULL,1,1,2,1,false,1,NULL),
  (NULL,1,2,1,4,false,2,NULL),
  (NULL,1,2,2,1,false,2,NULL),
  (NULL,1,2,1,5,true,NULL,1),
  (NULL,1,2,2,1,false,NULL,1);

Затем я создал следующие запросы, чтобы ответить на ваши вопросы 1,2 и 3. Я не уверен, что вы хотите, чтобы они все ответили одним запросом, который я делаю не думаю, что что-то из предоставленного вами набора данных будет соответствовать критериям, которые я решил не использовать.


1 - все идентификаторы, в которых matrix_id одинаковы и задание с stage_id = 1 выполнено = true:

SELECT
  MAX(ID) ID
FROM TEST.test_table tt 
WHERE MATRIX_ID IS NOT NULL
GROUP BY tt.MATRIX_ID
HAVING SUM(tt.COMPLETE) = (COUNT(*)-1)
;

Ответ : ID 2

Примечание : Полагаю, это не будет считаться проверкой, если STAGE_ID равен 1 и истинно, но я думаю, что это эффективно, если вы получите тот же результат и со временем при этом он всегда будет следить за тем, чтобы задание до его завершения, так как сумма СУБД завершенного логического поля всегда должна быть на 1 меньше, чем общее количество задач, НО, оставаясь, вы начнете укладывать больше задач, вам нужно будет немного их уточнить и подойти с чем-то более точным.


2 - И все идентификаторы, где deviation_id одинаковы, а задача с stage_id = 1 и complete = true:

SELECT
  MAX(ID) ID
FROM TEST.test_table tt 
WHERE tt.DEVIATION_ID IS NOT NULL
GROUP BY tt.DEVIATION_ID
HAVING SUM(tt.COMPLETE) = (COUNT(*)-1)
;

Ответ : ID 6


3 - все идентификаторы, где stage = 2 и current_phase равен [2,3 или 4] и завершен = fal:

SELECT
  tt.ID
FROM TEST.test_table tt 
WHERE tt.STAGE_ID = 1
AND tt.CURRENT_PHASE IN (2,3,4)
AND tt.COMPLETE = false
;

Ответ: : ID 3


Я думаю, что, поняв команду GROUP BY и команду HAVING, вы получите некоторое представление о том, как можно решить эти проблемы.

Вы можете проверить это здесь: https://www.db-fiddle.com/f/dD67jzQpENdJ5YSLBxoLbD/0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...