2011-10-09 79 views
0

我的數據庫(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

回答

2
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 –

0

你可以做一個選擇使用JOIN的,我不能告訴確切的表模式來回你的榜樣。 但看看MySQLs documentation並瞭解JOIN,他們會帶你到你想去的地方。

0

我也不是不從每個這些表的知道你的列,但按照你的說法或許我們可以也有說法是這樣完成的:

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中的連接語句中。

相關問題