我正在使用MySQL,我有一個查詢。還有一個子查詢。MySQL和使子查詢更高效
SELECT * FROM rg, list, status
WHERE (
(rg.required_status_id IS NULL AND rg.incorrect_status_id IS NULL) ||
(status.season_id = rg.required_status_id AND status.user_id = list.user_id) ||
(rg.incorrect_status_id IS NOT NULL AND
list.user_id NOT IN (SELECT user_id FROM status WHERE user_id = list.user_id AND season_id = rg.incorrect_status_id)
)
)
的問題是代碼的以下部分:
(rg.incorrect_status_id IS NOT NULL AND
list.user_id NOT IN (SELECT user_id FROM status WHERE user_id = list.user_id AND season_id = rg.incorrect_status_id)
)
我怎麼能檢查表「身份」具有一排,其中user_id
是一樣list.user_id
和season_id
是一樣rg.incorrect_status_id
?
更新
這裏是我當前的代碼,但它不會在所有的工作。我不知道該怎麼辦。
SELECT * FROM rg, list, status
LEFT JOIN status AS stat
INNER JOIN rg AS rglist
ON rglist.incorrect_status_id = stat.season_id
ON stat.season_id = rglist.incorrect_status_id
WHERE (
(rg.required_status_id IS NULL AND rg.incorrect_status_id IS NULL) ||
(status.season_id = rg.required_status_id AND status.user_id = list.user_id) ||
(rg.incorrect_status_id IS NOT NULL AND stat.user_id IS NULL)
)
)
更新2
我修改了名字,但基本思路是一樣的。
FROM sarjojen_rglistat, sarjojen_rglistojen_osakilpailut, kilpailukausien_kilpailut, sarjojen_osakilpailuiden_rgpisteet
, sarjojen_kilpailukaudet, sarjojen_kilpailukausien_kilpailusysteemit
/* , kayttajien_ilmoittautumiset */
/* , sarjojen_kilpailukausien_pelaajastatukset */
LEFT OUTER JOIN sarjojen_kilpailukausien_pelaajastatukset
ON sarjojen_kilpailukausien_pelaajastatukset.sarjan_kilpailukausi_id = sarjojen_rglistat.vaadittu_pelaajastatus_id
LEFT OUTER JOIN kayttajien_ilmoittautumiset
ON kayttajien_ilmoittautumiset.kayttaja_id = sarjojen_kilpailukausien_pelaajastatukset.kayttaja_id
現在,這個說:
柱未發現:1054未知列在「sarjojen_rglistat.vaadittu_pelaajastatus_id '的條款'
爲什麼會這樣呢?
我有一個名爲「sarjojen_rglistat」的表,並有一列「vaadittu_pelaajastatus_id」。
MySQL並沒有很好地優化'OR'。試着將你的查詢分解爲每個條件的單獨查詢,並將它們與'UNION'結合起來。 – Barmar
你知道在第一種情況下,它會用'NULL'連接每行'list'和'status'行的完全交叉乘積的行,對吧? – Barmar
請參閱http://stackoverflow.com/questions/21633115/return-row-only-if-value-doesnt-exist?lq=1,以獲得更好的方式來編寫第三個查詢,查找不匹配另一個行的行表。 – Barmar