选择所有满足来自其他表的约束的行

问题描述:

我的数据库(MySQL)包含5个表。选择所有满足来自其他表的约束的行

它应该描述某些动作,状态和约束。

对于任何要执行的操作都必须满足。 每个状态保证了某些约束得到满足:

  1. 操作(ID,姓名)
  2. 国(ID,姓名)
  3. 约束(ID,姓名)
  4. has_constraints(的action_id,Constraint_ID)
  5. assures_constraints(STATE_ID,Constraint_ID)

我的问题是:我该如何选择的所有行动,这是对执行一个给定的状态?

由于提前, 扬

+0

那么你有什么尝试? –

+0

@Matthew Farwell:各种各样的东西,但我有点SQL不识字。只是尝试了一些嵌套选择。这不是功课,顺便说一句。我只想知道 – sl0815

+0

这听起来像你正在寻找JOIN,sl0815。阅读JOIN上的MySQL文档,然后尝试返回更具体的问题。 – Corbin

SELECT a.* 
    FROM actions a 
WHERE NOT EXISTS 
     (
    SELECT 1 
    FROM has_constraints hc 
    WHERE hc.action_id = a.id 
     AND NOT EXISTS 
      ( 
     SELECT 1 
     FROM assure_constraints ac 
     WHERE ac.state_id = $my_state_id 
     AND ac.constraint_id = hc.constraint_id)) 
  • 检索没有约束的一切行动,一个国家也不会允许。
  • 包含完全没有限制的动作。
+0

不错。我更喜欢'EXISTS'子查询中的'SELECT *',但这只是个人偏好。 –

+0

@ypercube:AFAIK'SELECT 1'是规范的语法。但正如你所说,真的是个人喜好的问题。也许是我们不应该在SO上发布的其中一个问题。 ;) –

+0

@ypercube:显然,我的“规范”是没有根据的。我见过,你已经看到我的帖子:http://stackoverflow.com/questions/7710153/what-is-easier-to-read-in-exists-subqueries –

你可以做一个选择使用JOIN的,我不能告诉确切的表模式来回你的榜样。 但看看MySQLs documentation并了解JOIN,他们会带你到你想去的地方。

我也不是不从每个这些表的知道你的列,但按照你的说法或许我们可以也有说法是这样完成的:

SELECT 
<columns> 
FROM 
has_constraints `constraint` INNER JOIN actions action ON `constraint`.action_id = action.id 
RIGHT JOIN assure_constraints assure ON assure.constraint_id = `constraint`.id 
WHERE constraint.state_id = <id of state> 

如果你想获得一些列从状态表中,您可以将它添加到from中的连接语句中。