2017-06-22 109 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 

尝试上面的代码。

希望这会帮助你。