Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP ja tietokantavaihdos MySQL 8.1 -> 8.4

xxmss [26.04.2026 13:18:00]

#

Käytössä PHP 8.x. Tietokanta vaihtui MySQL 8.1 -> 8.4 ja samalla lakkasi toimimasta SQL-lauseke. Vanha toimi riittävän nopeasti, mutta uusi versio kestää ja kestää...

Olisiko antaa vinkkiä, miten 8.4:ssä toimivan SQL-lausekkeen saisi aikaiseksi niin, että se tekisi 100 %:sti saman asian kuin aiempi lauseke, mutta nopeasti?

Toimii MySQL 8.1:ssä:

$kysely = $this->yhteys->prepare("SELECT
kaaviopohjien_kierrosten_ottelupaikat.ottelunumero AS ottelunumero,
kilpailuiden_kaavioiden_erapistetilanteet.peli_monesko_era_ottelussa,
kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_a_pistesarja,
kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_a_pistetilanne,
kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_a_pistevoittoon,
kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_b_pistesarja,
kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_b_pistetilanne,
kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_b_pistevoittoon,
kilpailuiden_kaavioiden_ottelut.peli_pelimuoto_id

FROM kilpailuiden_kaavioiden_ottelut
/* täytyy löytyä */ INNER JOIN kaaviopohjien_kierrosten_ottelupaikat ON kaaviopohjien_kierrosten_ottelupaikat.id = kilpailuiden_kaavioiden_ottelut.kaaviopaikka_id
/* täytyy löytyä */ INNER JOIN kaaviopohjien_kierrokset ON kaaviopohjien_kierrokset.id = kaaviopohjien_kierrosten_ottelupaikat.kierros_id

/* täytyy löytyä */ INNER JOIN kilpailuiden_kaavioiden_erapistetilanteet ON kilpailuiden_kaavioiden_erapistetilanteet.kisakaavion_ottelun_peli_id = kilpailuiden_kaavioiden_ottelut.id

AND kilpailuiden_kaavioiden_erapistetilanteet.id = (SELECT MAX(id)
FROM kilpailuiden_kaavioiden_erapistetilanteet AS tilanteet
WHERE tilanteet.kisakaavion_ottelun_peli_id = kilpailuiden_kaavioiden_erapistetilanteet.kisakaavion_ottelun_peli_id
AND tilanteet.peli_monesko_era_ottelussa = kilpailuiden_kaavioiden_erapistetilanteet.peli_monesko_era_ottelussa)

WHERE kilpailuiden_kaavioiden_ottelut.kaavio_id = ?
GROUP BY
kaaviopohjien_kierrosten_ottelupaikat.ottelunumero,
kilpailuiden_kaavioiden_erapistetilanteet.peli_monesko_era_ottelussa,
kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_a_pistesarja,
kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_a_pistetilanne,
kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_a_pistevoittoon,
kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_b_pistesarja,
kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_b_pistetilanne,
kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_b_pistevoittoon,
kilpailuiden_kaavioiden_ottelut.peli_pelimuoto_id");

$kysely->bindValue(1, intval($kaavio_id), PDO::PARAM_INT);
$kysely->execute();

Toimii MySQL 8.4:ssä:

$kysely = $this->yhteys->prepare("SELECT
    kaaviopohjien_kierrosten_ottelupaikat.ottelunumero AS ottelunumero,
    kilpailuiden_kaavioiden_erapistetilanteet.peli_monesko_era_ottelussa,
    kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_a_pistesarja,
    kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_a_pistetilanne,
    kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_a_pistevoittoon,
    kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_b_pistesarja,
    kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_b_pistetilanne,
    kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_b_pistevoittoon,
    kilpailuiden_kaavioiden_ottelut.peli_pelimuoto_id

FROM kilpailuiden_kaavioiden_ottelut
INNER JOIN kaaviopohjien_kierrosten_ottelupaikat
    ON kaaviopohjien_kierrosten_ottelupaikat.id = kilpailuiden_kaavioiden_ottelut.kaaviopaikka_id
INNER JOIN kaaviopohjien_kierrokset
    ON kaaviopohjien_kierrokset.id = kaaviopohjien_kierrosten_ottelupaikat.kierros_id
INNER JOIN kilpailuiden_kaavioiden_erapistetilanteet
    ON kilpailuiden_kaavioiden_erapistetilanteet.kisakaavion_ottelun_peli_id = kilpailuiden_kaavioiden_ottelut.id

WHERE kilpailuiden_kaavioiden_ottelut.kaavio_id = ?
    /* TÄMÄ ON MUUTETTU: Käytetään pääkyselyn ottelu-ID:tä alikyselyssä */
    AND kilpailuiden_kaavioiden_erapistetilanteet.id = (
SELECT MAX(id)
FROM kilpailuiden_kaavioiden_erapistetilanteet AS tilanteet
WHERE tilanteet.kisakaavion_ottelun_peli_id = kilpailuiden_kaavioiden_ottelut.id
    AND tilanteet.peli_monesko_era_ottelussa = kilpailuiden_kaavioiden_erapistetilanteet.peli_monesko_era_ottelussa
)

GROUP BY
    kaaviopohjien_kierrosten_ottelupaikat.ottelunumero,
    kilpailuiden_kaavioiden_erapistetilanteet.peli_monesko_era_ottelussa,
    kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_a_pistesarja,
    kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_a_pistetilanne,
    kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_a_pistevoittoon,
    kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_b_pistesarja,
    kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_b_pistetilanne,
    kilpailuiden_kaavioiden_erapistetilanteet.peli_paikka_b_pistevoittoon,
    kilpailuiden_kaavioiden_ottelut.peli_pelimuoto_id");

$kysely->bindValue(1, intval($kaavio_id), PDO::PARAM_INT);
$kysely->execute();

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta