Запрос на присоединение к MySQL для извлечения идентификаторов, которые блокируют только ЗАКРЫТЫЕ ошибки - PullRequest
0 голосов
/ 06 марта 2012

Таблицы ошибок и зависимостей выглядят так:

select * from bugs; 
+--------+--------+
| bug_id | status |
+--------+--------+
|     20 | NEW    |
|     45 | CLOSED |
|     47 | NEW    |
|     30 | NEW    |
|     50 | CLOSED |
+--------+--------+


select * from dependencies;
+-----------+---------+
| dependson | blocked |
+-----------+---------+
|        20 |      45 |
|        20 |      47 |
|        30 |      50 |
+-----------+---------+

Ожидаемый результат запроса на соединение: 30

Что? Извлекайте только 30 из столбца зависимости, зависимости таблицы, потому что 30 - это единственная ( NEW status ), которая блокирует (col: заблокирован-50) ошибку, статус которой ЗАКРЫТ. Хотя запись зависимости 20 блокирует 45, которая ЗАКРЫТА, но она также блокирует 47, которая не ЗАКРЫТА.

Примечание: оба столбца зависят от заблокированного и являются внешним ключом bug_id.

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

Обновление: нужен статус только НОВЫЙ, не все.

Ответы [ 3 ]

1 голос
/ 06 марта 2012

Попробуйте этот запрос -

SELECT b.* FROM bugs b
  JOIN (
    SELECT
      d.*
    FROM dependencies d
      JOIN bugs b
        ON b.bug_id = d.blocked
    GROUP BY d.dependson
      HAVING COUNT(IF(status = 'CLOSED', status, NULL)) = COUNT(*)
  ) t
  ON b.bug_id = t.dependson
0 голосов
/ 06 марта 2012

Это не было проверено, но я не думаю, что вам понадобится объединение здесь.

SELECT dependson 
FROM dependencies

WHERE dependson NOT IN
(SELECT bug_id FROM bugs WHERE status <> 'CLOSED')

Таким образом, вы должны получить только dependson s, которые ЗАКРЫТЫ.

0 голосов
/ 06 марта 2012
Select bugs.* From bugs Inner Join dependencies On (bugs.bug_id = dependencies.blocked) Where bugs.status = 'CLOSED' And bugs.bug_id = dependencies.blocked

На самом деле, вам, вероятно, не нужна часть and этого оператора where, но я не могу проверить его, поэтому добавлю его туда для хорошей меры.

EDIT

Я только что видел, что вы пытаетесь получить зависимость, а не заблокирован. Я обновлю это.

Select bugs.bug_id From bugs Inner Join dependencies On (bugs.bug_id = dependencies.dependedson) 
  Where dependencies.dependson Not In 
    (Select dependencies.dependson From bugs Inner Join dependencies On (bugs.bug_id = dependencies.blocked) 
      Where bugs.status = 'New' And bugs.bug_id = dependencies.blocked) 
    And bugs.bug_id = dependencies.dependson
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...