我的數據庫(MySQL)包含5個表。選擇所有滿足來自其他表的約束的行
它應該描述某些動作,狀態和約束。
對於任何要執行的操作都必須滿足。 每個狀態保證了某些約束得到滿足:
- 操作(ID,姓名)
- 國(ID,姓名)
- 約束(ID,姓名)
- has_constraints(的action_id,Constraint_ID)
- assures_constraints(STATE_ID,Constraint_ID)
我的問題是:我該如何選擇的所有行動,這是對執行一個給定的狀態?
由於提前, 揚
我的數據庫(MySQL)包含5個表。選擇所有滿足來自其他表的約束的行
它應該描述某些動作,狀態和約束。
對於任何要執行的操作都必須滿足。 每個狀態保證了某些約束得到滿足:
我的問題是:我該如何選擇的所有行動,這是對執行一個給定的狀態?
由於提前, 揚
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 –
你可以做一個選擇使用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中的連接語句中。
那麼你有什麼嘗試? –
@Matthew Farwell:各種各樣的東西,但我有點SQL不識字。只是嘗試了一些嵌套選擇。這不是功課,順便說一句。我只想知道 – sl0815
這聽起來像你正在尋找JOIN,sl0815。閱讀JOIN上的MySQL文檔,然後嘗試返回更具體的問題。 – Corbin