2017-06-22 90 views
0

我有MySQL數據庫和SQL查詢,但它並未完全清理,但這不是最大的問題。主要的問題是一個子查詢沒有按我的意願工作。請看下面。MySQL和子查詢不會返回任何結果

SELECT 
    sarjojen_rglistat.montako_huonointa_pois_lkm AS ei_huomioitavat_kilpailut_lkm 
    , sarjojen_rglistat.montako_suora_nousu_lkm AS montako_suora_nousu_lkm 
    , sarjojen_rglistat.montako_suora_pudotus_lkm AS montako_suora_pudotus_lkm 
    , sarjojen_rglistat.montako_nousukarsinta_lkm AS montako_nousukarsinta_lkm 
    , sarjojen_rglistat.montako_pudotuskarsinta_lkm AS montako_pudotuskarsinta_lkm 
    , sarjojen_rglistat.vaadittu_pelaajastatus_id AS vaadittu_pelaajastatus_id 
    , sarjojen_rglistat.epakelpo_pelaajastatus_id AS epakelpo_pelaajastatus_id 
    , sarjojen_rglistojen_osakilpailut.monesko_kilpailu AS monesko_kilpailu 
    , sarjojen_rglistojen_osakilpailut.sarakeotsikko AS kilpailu_sarakeotsikko 
    , sarjojen_osakilpailuiden_rgpisteet.kayttaja_id AS kayttaja_id 
    , sarjojen_osakilpailuiden_rgpisteet.pistemaara AS pisteet 
    , sarjojen_osakilpailuiden_rgpisteet.kompensaatiopistemaara AS kompensaatiopisteet 
    , kilpailukausien_kilpailut.id AS kilpailu_id 
    , kilpailukausien_kilpailut.ajankohta_alkamispaiva AS kilpailu_alkamispaiva 
    , kilpailukausien_kilpailut.kilpailunimi_virallinen AS kilpailu_nimi 
    , kayttajien_ilmoittautumiset.pelaaja_oma_nimi_txt AS kayttaja_nimiteksti 
    , kayttajien_ilmoittautumiset.pelaaja_oma_seura_lyh_txt AS kayttaja_seurateksti 
    , kayttajien_ilmoittautumiset.pelaaja_oma_kunta_txt AS kayttaja_kuntateksti 
    , sarjojen_kilpailukaudet.kausi_id AS kausi_id 

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 (sarjojen_kilpailukausien_pelaajastatukset.kayttaja_id = kayttajien_ilmoittautumiset.kayttaja_id) 

WHERE 
    sarjojen_rglistat.id = 4 
    AND sarjojen_rglistojen_osakilpailut.rglista_id = sarjojen_rglistat.id 
    AND sarjojen_rglistojen_osakilpailut.kilpailu_id = kilpailukausien_kilpailut.id 
    AND sarjojen_osakilpailuiden_rgpisteet.kilpailu_id = kilpailukausien_kilpailut.id 

    AND sarjojen_kilpailukausien_kilpailusysteemit.id = kilpailukausien_kilpailut.kauden_kilpailusysteemi_id 
    AND sarjojen_kilpailukausien_kilpailusysteemit.sarjan_kilpailukausi_id = sarjojen_kilpailukaudet.id 

    AND kayttajien_ilmoittautumiset.kayttaja_id = sarjojen_osakilpailuiden_rgpisteet.kayttaja_id 
    AND kayttajien_ilmoittautumiset.kilpailu_id = sarjojen_osakilpailuiden_rgpisteet.kilpailu_id 

    AND kilpailukausien_kilpailut.kausi_id IS NULL 
    AND kilpailukausien_kilpailut.seura_id IS NULL 

    AND ((sarjojen_rglistat.vaadittu_pelaajastatus_id IS NULL AND sarjojen_rglistat.epakelpo_pelaajastatus_id IS NULL) || 
     (sarjojen_kilpailukausien_pelaajastatukset.sarjan_kilpailukausi_id = sarjojen_rglistat.vaadittu_pelaajastatus_id AND sarjojen_kilpailukausien_pelaajastatukset.kayttaja_id = kayttajien_ilmoittautumiset.kayttaja_id) || 

     (sarjojen_rglistat.epakelpo_pelaajastatus_id IS NOT NULL 
     AND NOT EXISTS (
     SELECT * 
     FROM sarjojen_kilpailukausien_pelaajastatukset 
     WHERE kayttaja_id = kayttajien_ilmoittautumiset.kayttaja_id 
       AND sarjan_kilpailukausi_id = sarjojen_rglistat.epakelpo_pelaajastatus_id 
     ) 
    )) 

    ORDER BY sarjojen_kilpailukaudet.kausi_id ASC, kilpailukausien_kilpailut.ajankohta_alkamispaiva ASC, kilpailukausien_kilpailut.id ASC 

問題是我的代碼的以下部分。它應該在兩種情況下返回一行:

1)如果sarjojen_kilpailukausien_pelaajastatukset = sarjojen_rglistat.vaadittu_pelaajastatus_id

2)sarjojen_kilpailukausien_pelaajastatukset = sarjojen_rglistat.epakelpo_pelaajastatus_id不存在。

(sarjojen_rglistat.epakelpo_pelaajastatus_id IS NOT NULL 
    AND NOT EXISTS (
    SELECT * 
    FROM sarjojen_kilpailukausien_pelaajastatukset 
    WHERE kayttaja_id = kayttajien_ilmoittautumiset.kayttaja_id 
      AND sarjan_kilpailukausi_id = sarjojen_rglistat.epakelpo_pelaajastatus_id 
    ) 
)) 

現在它不返回任何結果。我怎麼能解決這個問題?

+1

*從不*在'FROM'子句中使用逗號。 *總是*使用正確的,明確的'JOIN'語法。 –

+0

@GordonLinoff你能告訴我怎麼做嗎? – xms

+0

@xms:你已經知道如何去做。對於外部連接,你已經在使用它('LEFT OUTER JOIN ... ON',但是對於內部連接('INNER JOIN ... ON'),你不需要。 –

回答

1

那麼要麼skk.sarjan_kilpailukausi_id = sr.vaadittu_pelaajastatus_idNOT EXISTS (SELECT * FROM skp WHERE skp.kayttaja_id = ki.kayttaja_id)?好的,我在下面的查詢中應用了這個條件。

我使用表別名使其更加輻射。我也重寫了你的連接。請檢查它們。

SELECT 
    sr.montako_huonointa_pois_lkm AS ei_huomioitavat_kilpailut_lkm 
    , sr.montako_suora_nousu_lkm AS montako_suora_nousu_lkm 
    , sr.montako_suora_pudotus_lkm AS montako_suora_pudotus_lkm 
    , sr.montako_nousukarsinta_lkm AS montako_nousukarsinta_lkm 
    , sr.montako_pudotuskarsinta_lkm AS montako_pudotuskarsinta_lkm 
    , sr.vaadittu_pelaajastatus_id AS vaadittu_pelaajastatus_id 
    , sr.epakelpo_pelaajastatus_id AS epakelpo_pelaajastatus_id 
    , sro.monesko_kilpailu AS monesko_kilpailu 
    , sro.sarakeotsikko AS kilpailu_sarakeotsikko 
    , sor.kayttaja_id AS kayttaja_id 
    , sor.pistemaara AS pisteet 
    , sor.kompensaatiopistemaara AS kompensaatiopisteet 
    , kk.id AS kilpailu_id 
    , kk.ajankohta_alkamispaiva AS kilpailu_alkamispaiva 
    , kk.kilpailunimi_virallinen AS kilpailu_nimi 
    , ki.pelaaja_oma_nimi_txt AS kayttaja_nimiteksti 
    , ki.pelaaja_oma_seura_lyh_txt AS kayttaja_seurateksti 
    , ki.pelaaja_oma_kunta_txt AS kayttaja_kuntateksti 
    , sk.kausi_id AS kausi_id 
FROM sarjojen_rglistat sr 
JOIN sarjojen_rglistojen_osakilpailut sro ON sro.rglista_id = sr.id 
JOIN kilpailukausien_kilpailut kk ON kk.id = sro.kilpailu_id 
            AND kk.kausi_id IS NULL 
            AND kk.seura_id IS NULL 
JOIN sarjojen_osakilpailuiden_rgpisteet sor ON sor.kilpailu_id = kk.id 
JOIN sarjojen_kilpailukausien_kilpailusysteemit skk 
       ON skk.id = kk.kauden_kilpailusysteemi_id 
JOIN sarjojen_kilpailukaudet sk ON sk.id = skk.sarjan_kilpailukausi_id 
LEFT JOIN sarjojen_kilpailukausien_pelaajastatukset skp 
       ON skp.sarjan_kilpailukausi_id = sr.vaadittu_pelaajastatus_id 
       AND skp.kayttaja_id = sor.kayttaja_id 
LEFT JOIN kayttajien_ilmoittautumiset ki ON ki.kayttaja_id = sor.kayttaja_id 
             AND ki.kilpailu_id = sor.kilpailu_id 
WHERE sr.id = 4 
AND 
(
    (
    sr.vaadittu_pelaajastatus_id IS NULL 
    AND 
    sr.epakelpo_pelaajastatus_id IS NULL 
) 
    OR 
    (
    skp.sarjan_kilpailukausi_id = sr.vaadittu_pelaajastatus_id 
    AND 
    skp.kayttaja_id = ki.kayttaja_id 
) 
    OR 
    (
    skk.sarjan_kilpailukausi_id = sr.vaadittu_pelaajastatus_id 
    OR 
    NOT EXISTS 
    (
     SELECT * 
     FROM skp 
     WHERE skp.kayttaja_id = ki.kayttaja_id 
    ) 
) 
) 
ORDER BY sk.kausi_id ASC, kk.ajankohta_alkamispaiva ASC, kk.id ASC; 
+0

'sor.kayttaja_id可能'存在於'skp'中,但是'skp'。sarjan_kilpailukausi_id'不能是'sr.epakelpo_pelaajastatus_id'。換句話說,'sor.kayttaja_id'在'skp'中不存在,或者如果是,'skp.sarjan_kilpailukausi_id'不能是'sr.epakelpo_pelaajastatus_id'。 – xms

+0

對不起,我感到困惑。簡單地寫出每一個會讓你想要結果的條件,並將它們與'OR'結合起來。我明白'不存在(...)'就是這樣一種情況,而'skk.sarjan_kilpailukausi_id = sr.vaadittu_pelaajastatus_id'是另一種情況。如果情況並非如此,那麼在那裏放置正確的條件;模式總是一樣的。 –

+0

我修改了最後一個'OR'部分,現在它完美地工作。非常感謝你的時間和幫助! – xms

0
SELECT 
    sarjojen_rglistat.montako_huonointa_pois_lkm AS ei_huomioitavat_kilpailut_lkm 
    , sarjojen_rglistat.montako_suora_nousu_lkm AS montako_suora_nousu_lkm 
    , sarjojen_rglistat.montako_suora_pudotus_lkm AS montako_suora_pudotus_lkm 
    , sarjojen_rglistat.montako_nousukarsinta_lkm AS montako_nousukarsinta_lkm 
    , sarjojen_rglistat.montako_pudotuskarsinta_lkm AS montako_pudotuskarsinta_lkm 
    , sarjojen_rglistat.vaadittu_pelaajastatus_id AS vaadittu_pelaajastatus_id 
    , sarjojen_rglistat.epakelpo_pelaajastatus_id AS epakelpo_pelaajastatus_id 
    , sarjojen_rglistojen_osakilpailut.monesko_kilpailu AS monesko_kilpailu 
    , sarjojen_rglistojen_osakilpailut.sarakeotsikko AS kilpailu_sarakeotsikko 
    , sarjojen_osakilpailuiden_rgpisteet.kayttaja_id AS kayttaja_id 
    , sarjojen_osakilpailuiden_rgpisteet.pistemaara AS pisteet 
    , sarjojen_osakilpailuiden_rgpisteet.kompensaatiopistemaara AS kompensaatiopisteet 
    , kilpailukausien_kilpailut.id AS kilpailu_id 
    , kilpailukausien_kilpailut.ajankohta_alkamispaiva AS kilpailu_alkamispaiva 
    , kilpailukausien_kilpailut.kilpailunimi_virallinen AS kilpailu_nimi 
    , kayttajien_ilmoittautumiset.pelaaja_oma_nimi_txt AS kayttaja_nimiteksti 
    , kayttajien_ilmoittautumiset.pelaaja_oma_seura_lyh_txt AS kayttaja_seurateksti 
    , kayttajien_ilmoittautumiset.pelaaja_oma_kunta_txt AS kayttaja_kuntateksti 
    , sarjojen_kilpailukaudet.kausi_id AS kausi_id 

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 (sarjojen_kilpailukausien_pelaajastatukset.kayttaja_id = kayttajien_ilmoittautumiset.kayttaja_id) 

WHERE 
    sarjojen_rglistat.id = 4 
    AND sarjojen_rglistojen_osakilpailut.rglista_id = sarjojen_rglistat.id 
    AND sarjojen_rglistojen_osakilpailut.kilpailu_id = kilpailukausien_kilpailut.id 
    AND sarjojen_osakilpailuiden_rgpisteet.kilpailu_id = kilpailukausien_kilpailut.id 

    AND sarjojen_kilpailukausien_kilpailusysteemit.id = kilpailukausien_kilpailut.kauden_kilpailusysteemi_id 
    AND sarjojen_kilpailukausien_kilpailusysteemit.sarjan_kilpailukausi_id = sarjojen_kilpailukaudet.id 

    AND kayttajien_ilmoittautumiset.kayttaja_id = sarjojen_osakilpailuiden_rgpisteet.kayttaja_id 
    AND kayttajien_ilmoittautumiset.kilpailu_id = sarjojen_osakilpailuiden_rgpisteet.kilpailu_id 

    AND kilpailukausien_kilpailut.kausi_id IS NULL 
    AND kilpailukausien_kilpailut.seura_id IS NULL 

    AND ((sarjojen_rglistat.vaadittu_pelaajastatus_id IS NULL AND sarjojen_rglistat.epakelpo_pelaajastatus_id IS NULL) || 
     (sarjojen_kilpailukausien_pelaajastatukset.sarjan_kilpailukausi_id = sarjojen_rglistat.vaadittu_pelaajastatus_id AND sarjojen_kilpailukausien_pelaajastatukset.kayttaja_id = kayttajien_ilmoittautumiset.kayttaja_id) || 

     (sarjojen_rglistat.epakelpo_pelaajastatus_id IS NOT NULL 
     AND sarjojen_rglistat.epakelpo_pelaajastatus_id NOT IN(    <!-------I had made changes to this line 
     SELECT sarjojen_rglistat.epakelpo_pelaajastatus_id 
     FROM sarjojen_kilpailukausien_pelaajastatukset 
     WHERE kayttaja_id = kayttajien_ilmoittautumiset.kayttaja_id 
       AND sarjan_kilpailukausi_id = sarjojen_rglistat.epakelpo_pelaajastatus_id 
     ) 
    )) 

    ORDER BY sarjojen_kilpailukaudet.kausi_id ASC, kilpailukausien_kilpailut.ajankohta_alkamispaiva ASC, kilpailukausien_kilpailut.id ASC 

or

SELECT 
    sarjojen_rglistat.montako_huonointa_pois_lkm AS ei_huomioitavat_kilpailut_lkm 
    , sarjojen_rglistat.montako_suora_nousu_lkm AS montako_suora_nousu_lkm 
    , sarjojen_rglistat.montako_suora_pudotus_lkm AS montako_suora_pudotus_lkm 
    , sarjojen_rglistat.montako_nousukarsinta_lkm AS montako_nousukarsinta_lkm 
    , sarjojen_rglistat.montako_pudotuskarsinta_lkm AS montako_pudotuskarsinta_lkm 
    , sarjojen_rglistat.vaadittu_pelaajastatus_id AS vaadittu_pelaajastatus_id 
    , sarjojen_rglistat.epakelpo_pelaajastatus_id AS epakelpo_pelaajastatus_id 
    , sarjojen_rglistojen_osakilpailut.monesko_kilpailu AS monesko_kilpailu 
    , sarjojen_rglistojen_osakilpailut.sarakeotsikko AS kilpailu_sarakeotsikko 
    , sarjojen_osakilpailuiden_rgpisteet.kayttaja_id AS kayttaja_id 
    , sarjojen_osakilpailuiden_rgpisteet.pistemaara AS pisteet 
    , sarjojen_osakilpailuiden_rgpisteet.kompensaatiopistemaara AS kompensaatiopisteet 
    , kilpailukausien_kilpailut.id AS kilpailu_id 
    , kilpailukausien_kilpailut.ajankohta_alkamispaiva AS kilpailu_alkamispaiva 
    , kilpailukausien_kilpailut.kilpailunimi_virallinen AS kilpailu_nimi 
    , kayttajien_ilmoittautumiset.pelaaja_oma_nimi_txt AS kayttaja_nimiteksti 
    , kayttajien_ilmoittautumiset.pelaaja_oma_seura_lyh_txt AS kayttaja_seurateksti 
    , kayttajien_ilmoittautumiset.pelaaja_oma_kunta_txt AS kayttaja_kuntateksti 
    , sarjojen_kilpailukaudet.kausi_id AS kausi_id 

FROM (sarjojen_rglistat 
    JOIN sarjojen_rglistojen_osakilpailut 
    JOIN kilpailukausien_kilpailut 
    JOIN sarjojen_osakilpailuiden_rgpisteet 
    JOIN sarjojen_kilpailukaudet 
    JOIN 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 (sarjojen_kilpailukausien_pelaajastatukset.kayttaja_id = kayttajien_ilmoittautumiset.kayttaja_id) 

WHERE 
    sarjojen_rglistat.id = 4 
    AND sarjojen_rglistojen_osakilpailut.rglista_id = sarjojen_rglistat.id 
    AND sarjojen_rglistojen_osakilpailut.kilpailu_id = kilpailukausien_kilpailut.id 
    AND sarjojen_osakilpailuiden_rgpisteet.kilpailu_id = kilpailukausien_kilpailut.id 

    AND sarjojen_kilpailukausien_kilpailusysteemit.id = kilpailukausien_kilpailut.kauden_kilpailusysteemi_id 
    AND sarjojen_kilpailukausien_kilpailusysteemit.sarjan_kilpailukausi_id = sarjojen_kilpailukaudet.id 

    AND kayttajien_ilmoittautumiset.kayttaja_id = sarjojen_osakilpailuiden_rgpisteet.kayttaja_id 
    AND kayttajien_ilmoittautumiset.kilpailu_id = sarjojen_osakilpailuiden_rgpisteet.kilpailu_id 

    AND kilpailukausien_kilpailut.kausi_id IS NULL 
    AND kilpailukausien_kilpailut.seura_id IS NULL 

    AND (
     (
      sarjojen_rglistat.vaadittu_pelaajastatus_id IS NULL AND sarjojen_rglistat.epakelpo_pelaajastatus_id IS NULL 
     ) 
     || 
     (
      sarjojen_kilpailukausien_pelaajastatukset.sarjan_kilpailukausi_id = sarjojen_rglistat.vaadittu_pelaajastatus_id 
      AND sarjojen_kilpailukausien_pelaajastatukset.kayttaja_id = kayttajien_ilmoittautumiset.kayttaja_id 
     ) 
     || 
     (
       sarjojen_rglistat.epakelpo_pelaajastatus_id IS NOT NULL 
       AND sarjojen_rglistat.epakelpo_pelaajastatus_id NOT IN(
                    SELECT sarjojen_rglistat.epakelpo_pelaajastatus_id 
                    FROM sarjojen_kilpailukausien_pelaajastatukset 
                    WHERE kayttaja_id = kayttajien_ilmoittautumiset.kayttaja_id 
                      AND sarjan_kilpailukausi_id = sarjojen_rglistat.epakelpo_pelaajastatus_id 
                   ) 
     ) 
    ) 

    ORDER BY sarjojen_kilpailukaudet.kausi_id ASC, kilpailukausien_kilpailut.ajankohta_alkamispaiva ASC, kilpailukausien_kilpailut.id ASC 

嘗試上面的代碼。

希望這會幫助你。