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

Lebe80 [27.04.2026 09:18:19]

#

Itsellä tulee mieleen, että ennen kuin muuttaa tietokantakyselyä mitenkään, niin onko tietokannassa minkäänlaista indexointia päällä?

Enkä jaksa alkaa tutkia mitä tuossa nyt haetaan, mutta tarvitseeko tuo kaikki hakea yhdellä kyselyllä? Onko kyseessä siis php-skripti esim. nettisivuilla? Voisiko tuota pilkkoa osiin ja välimuistittaa kyselyiden tuloksia ja hyödyntää sitä. Eli kuinka usein nuo parametrit vaihtuu ja voisiko tuossa hyödyntää että tuloksia lasketaan ennalta ja näytetään vain "välimuistitettuja" raportteja?

Edit:
Nopea lukaisu ja ainoa muuttuva parametri on pelimuoto_id. Voisiko tietokantahaun tehdä kerran ja tallentaa johonkin välimuistiin tuon pelimuoto_id:n perusteella?

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta