0

我有 2 张桌子投诉和任务。

投诉ID 在投诉表(即父表)中是唯一的,它是任务表中的外键。

因此,一个投诉可以有多个任务,因此在任务表中,您可以多次拥有相同的投诉 ID。

当所有相关任务的状态为完成时,我想显示投诉表中的所有字段

我已经尝试过了,但它不能完全工作,因为如果投诉有 4 个任务并且只有 1 个任务被标记为完成,那么它会拉该投诉:

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

如果有人可以帮助我解决这个问题,我将不胜感激。

4

4 回答 4

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

您只想在“内部”表中查找外键属性。所以,这样写: SELECT * FROM 投诉 WHERE 投诉 ID IN (SELECT 投诉 ID * FROM 任务 WHERE 完成 =“yes”) ORDER BY 截止日期 * 或任务表上的任何外键

于 2013-02-08T11:37:00.563 回答
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 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 的表结构。激进的,来自他的 SQL FIDDLE。

希望能帮助到你

于 2013-02-08T11:53:33.730 回答