0

2 つのテーブルの苦情とタスクがあります。

苦情IDは、苦情テーブル、つまり親テーブルで一意であり、タスクテーブルの外部キーです。

したがって、1 つの苦情に複数のタスクが含まれる可能性があるため、タスク テーブルでは同じ苦情 ID を何度も持つことができます。

すべての関連タスクのステータスが完了のときに、苦情テーブルのすべてのフィールドを表示したい

私はこれを試しましたが、苦情に4つのタスクがあり、1つのタスクのみが完了としてマークされている場合、その苦情を引き出すため、完全には機能しません:

SELECT * FROM complaints WHERE complaintID IN 
(SELECT * FROM tasks WHERE completed="yes") ORDER BY deadline

誰かがこれで私を助けてくれたら幸いです。

4

4 に答える 4

0

あなたもこのようにそれを行うことができます

select complaints.*, tasks.* from complaints, tasks where 
complaints.complaintID=tasks.complaintID and tasks.completed='yes' and 
complaints.complaintID NOT IN (select complaintID from tasks where completed='no')

使用されたテーブル構造は次のとおりです。

CREATE TABLE complaints (
  complaintID INT AUTO_INCREMENT PRIMARY KEY,
  content VARCHAR(255),
  deadline datetime
  );

CREATE TABLE tasks (
  tasksid INT AUTO_INCREMENT PRIMARY KEY,
  complaintID INT,
  completed ENUM ('yes','no')
  );

INSERT INTO complaints(content,deadline) VALUES ('complaint1', NOW()+INTERVAL 3 day), ('complaint2',NOW()+INTERVAL 8 day);

INSERT INTO tasks (complaintID, completed) VALUES(1,'no'), (1,'yes'), (2,'no'); 

@Mrのテーブル構造を使用しました。彼のSQLFIDDLEからのラジカル。

それが役に立てば幸い

于 2013-02-08T11:53:33.730 に答える
0

編集済み

これを試して:

 SELECT * FROM complaints 
 WHERE NOT EXISTS 
       (SELECT complaintid 
       FROM tasks 
       WHERE complaintid 
       in (SELECT complaintID 
           FROM tasks 
           WHERE tasks.complaintID = complaints.complaintid 
           and completed = 'no') 
       )ORDER BY deadline;

SQL フィドルのデモ

これは、上記の私の回答をテストするために使用した場合のテーブル構造とサンプル データです。

CREATE TABLE complaints (
  complaintID INT AUTO_INCREMENT PRIMARY KEY,
  content VARCHAR(255),
  deadline datetime
  );

CREATE TABLE tasks (
  tasksid INT AUTO_INCREMENT PRIMARY KEY,
  complaintID INT,
  completed ENUM ('yes','no')
  );

INSERT INTO complaints(content,deadline) VALUES ('complaint1', NOW()+INTERVAL 3 day), ('complaint2',NOW()+INTERVAL 8 day),('complaint3', NOW()+INTERVAL 3 day);

INSERT INTO tasks (complaintID, completed) VALUES(1,'no'), (1,'yes'), (2,'yes'), (1,'no'), (1,'yes'),  (1,'yes'), (2,'no'), (3,'yes'), (3, 'yes');
于 2013-02-08T11:41:19.127 に答える
0
select  *
from    complaints c
where   not exists
        (
        select  *
        from    tasks t
        where   t.ComplaintID = c.ComplaintID
                and t.Completed <> 'yes'
        )
于 2013-02-08T11:24:57.327 に答える
0

「内部」テーブルの外部キー属性のみを検索したい。したがって、次のように記述します。

于 2013-02-08T11:37:00.563 に答える