2017-06-22 1 views
0

J'ai une base de données MySQL et une requête SQL qui n'est pas encore complètement nettoyée, mais ce n'est pas le plus gros problème. Le problème principal est une sous-requête qui ne fonctionne pas comme je le souhaite. S'il vous plaît voir ci-dessous.MySQL et la sous-requête ne donne aucun résultat

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 

Le problème est la partie suivante de mon code. Elle doit retourner une ligne dans deux cas:

1) si sarjojen_kilpailukausien_pelaajastatukset = sarjojen_rglistat.vaadittu_pelaajastatus_id

ou

2) sarjojen_kilpailukausien_pelaajastatukset = sarjojen_rglistat.epakelpo_pelaajastatus_id n'existe pas.

(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 
    ) 
)) 

Il ne renvoie aucun résultat. Comment pourrais-je résoudre le problème?

+1

* Ne jamais utiliser les virgules dans la clause 'FROM'. * Toujours * utiliser une syntaxe 'JOIN' correcte et explicite. –

+0

@GordonLinoff Pourriez-vous me montrer comment le faire? – xms

+0

@xms: Vous savez déjà comment le faire. Pour les jointures externes, vous l'utilisez déjà ("LEFT OUTER JOIN ... ON", mais pour les jointures internes ("INNER JOIN ... ON") –

Répondre

1

Donc soit skk.sarjan_kilpailukausi_id = sr.vaadittu_pelaajastatus_id ou NOT EXISTS (SELECT * FROM skp WHERE skp.kayttaja_id = ki.kayttaja_id)? Ok, j'ai appliqué cette condition dans la requête suivante. J'utilise des alias de table pour le rendre plus radable. J'ai également réécrit vos jointures. S'il vous plaît vérifiez-les.

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 peut exister dans' skp' mais ensuite 'skp.sarjan_kilpailukausi_id' ne peut pas être 'sr.epakelpo_pelaajastatus_id'. En d'autres termes, 'sor.kayttaja_id' n'existe pas dans' skp' ou, si c'est le cas, 'skp.sarjan_kilpailukausi_id' ne peut pas être' sr.epakelpo_pelaajastatus_id'. – xms

+0

Désolé je suis confus. Écrivez simplement chaque condition qui vous donnerait envie d'un résultat et combinez-les avec 'OR'. J'ai compris que "NON EXISTE (...)" est une de ces conditions et "skk.sarjan_kilpailukausi_id = sr.vaadittu_pelaajastatus_id" en est une autre. Si ce n'est pas le cas, mettez-y les bonnes conditions; le motif est toujours le même. –

+0

J'ai modifié la dernière section 'OR' et maintenant cela fonctionne parfaitement. Merci beaucoup de votre temps et de votre aide! – 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 

Essayez code ci-dessus.

J'espère que cela vous aidera.