选择所有满足来自其他表的约束的行
我的数据库(MySQL)包含5个表。选择所有满足来自其他表的约束的行
它应该描述某些动作,状态和约束。
对于任何要执行的操作都必须满足。 每个状态保证了某些约束得到满足:
- 操作(ID,姓名)
- 国(ID,姓名)
- 约束(ID,姓名)
- has_constraints(的action_id,Constraint_ID)
- assures_constraints(STATE_ID,Constraint_ID)
我的问题是:我该如何选择的所有行动,这是对执行一个给定的状态?
由于提前, 扬
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))
- 检索没有约束的一切行动,一个国家也不会允许。
- 包含完全没有限制的动作。
不错。我更喜欢'EXISTS'子查询中的'SELECT *',但这只是个人偏好。 –
@ypercube:AFAIK'SELECT 1'是规范的语法。但正如你所说,真的是个人喜好的问题。也许是我们不应该在SO上发布的其中一个问题。 ;) –
@ypercube:显然,我的“规范”是没有根据的。我见过,你已经看到我的帖子:http://stackoverflow.com/questions/7710153/what-is-easier-to-read-in-exists-subqueries –
我也不是不从每个这些表的知道你的列,但按照你的说法或许我们可以也有说法是这样完成的:
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中的连接语句中。
那么你有什么尝试? –
@Matthew Farwell:各种各样的东西,但我有点SQL不识字。只是尝试了一些嵌套选择。这不是功课,顺便说一句。我只想知道 – sl0815
这听起来像你正在寻找JOIN,sl0815。阅读JOIN上的MySQL文档,然后尝试返回更具体的问题。 – Corbin