如何在MySQL中编写此查询?

时间:2016-05-16 12:12:58

标签: mysql

我有以下表格:

project(pid integer primary key, title varchar(30), finished boolean)
action(aid integer primary key, title varchar(30), finished boolean)
project_action(pid integer, aid integer, primary key(pid, aid))

项目可以包含多个操作,一个操作只能属于none或一个项目。因此,cardinatlity是(项目)0..1< - > *(行动)。

如何才能完成所有已完成操作的项目?

我试过这个,但如果只完成了一个动作,那已经给了我一个项目:

SELECT pid FROM project WHERE pid IN (SELECT DISTINCT pid FROM project_action WHERE aid IN (SELECT aid FROM action WHERE action.finished = true));

5 个答案:

答案 0 :(得分:1)

虽然您对表格内容的意图有点不清楚,但我认为您的结构可能有点偏差。让我举一个汽车维修的简单例子(我绝不是一个汽车车身人员)。

Project, Repair Person "A" car.
Pre-clean
Pull dent / repair parts
Apply any filler
Sand it
Paint

如果“Actions”在多个项目中保持一致,那么该表将没有“已完成”的布尔标志。该标志将特定于正在处理的一个项目。如果我有10辆车,我可以完全完成3辆,在不同阶段的某个地方工作7辆。所以,那就是说,我希望结构更像是

project(pid integer primary key, title varchar(30), finished boolean)
action(aid integer title varchar(30))
project_action(pid integer, aid integer, finished boolean, primary key(pid, aid))

说完所有这些,并保持原有的结构,你可以有一个项目,每个例子,需要在其上执行2,3或更多动作。如果任何操作不完整,则整个项目不完整。我还会根据(pid,aid,finished)

在你的“Action”表上有一个索引

然后做一个NOT EXISTS of finished = false

SELECT
      p.pid,
      p.title
   from
      project p
   where
      NOT EXISTS ( select pa.pid
                     from project_action pa
                        join action a on pa.aid = a.aid
                        AND a.finished = false
                     where pa.pid = p.pid )

这基本上是在说明......给我所有项目,其中没有“FALSE”已完成的项目待处理项目,无论当前项目是什么。如果找到符合条件的记录,则EXISTS(或NOT EXISTS)会立即停止。因此,如果项目中有10件事情不完整,那么一旦找到一件事,就会通过合格的WHERE来完成,接受或拒绝项目记录并转到下一个项目。

答案 1 :(得分:0)

我会加入表格:

import Foundation
import StoreKit

class ProductDataModel: NSObject, NSCoding {

    var product = SKProduct()

    // MARK: - var and let
    private let coderKey = "ProductDataModel"

    override init() {
        super.init()
    }

    convenience init(product: SKProduct) {
        self.init()
        self.product = product
    }

    required init?(coder aDecoder: NSCoder) {
        self.product = aDecoder.decodeObjectForKey(coderKey) as! SKProduct

    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(self.product, forKey: coderKey)
    }
}

答案 2 :(得分:0)

尝试仅选择没有未完成操作的项目。您应该记住,这种方法将为您提供没有任何操作的项目。

SELECT pid FROM project WHERE pid NOT IN
  (SELECT DISTINCT pid FROM project_action WHERE aid IN 
     (SELECT aid FROM action WHERE action.finished = false)
  );

答案 3 :(得分:0)

试试这个 -

SELECT project.pid FROM project LEFT JOIN project_action ON project_action.pid = project.pid LEFT JOIN action ON project_action.aid = action.aid WHERE action.finished = true

答案 4 :(得分:0)

SELECT p.pid FROM project p WHERE p.pid NOT IN 
  (SELECT pa.pid FROM project_action pa 
   JOIN action a ON pa.aid = a.aid 
   WHERE a.finished = FALSE)