Subinterogare corelată MySQL în clauza SELECT (Programare, Mysql, Sql, Selectează, Subinterogare Corelată)

Finley a intrebat.

Încerc să execut o subinterogare corelată în clauza SELECT. SELECT a unei interogări MySQL. Cum pot utiliza valoarea unui rând dintr-o altă coloană în interiorul clauzei WHERE clauza subinterogării mele?

Am făcut referire la secțiunea „Exemplu de subinterogare corelată” din această pagină web, , dar, din anumite motive, interogarea mea nu funcționează la fel.

Iată codul meu:

SELECT Year,
     ( SELECT COUNT(*)
       FROM systems
       WHERE SYSTEMTYPE = 'handheld' AND Year = sys.Year
     ) as handheld,
     ( SELECT COUNT(*)
       FROM systems
       WHERE SYSTEMTYPE = 'console' AND Year = sys.Year
     ) as console,
FROM systems as sys
WHERE Year IS NOT NULL

Practic, încerc să creez un tabel care să arate câte sisteme de fiecare tip au fost create pentru fiecare an. Când execut această interogare în MySQL Workbench, ea rulează până când expiră conexiunea la baza de date. Nu văd în ce fel această interogare este foarte diferită de cea de pe site-ul la care fac referire.

Orice ajutor ar fi foarte apreciat! Dacă mi se pare că există o modalitate mai bună de a rezolva acest lucru, sunt deschis și la aceste idei. Vă mulțumesc!

Comentarii

  • Este systems indexată corespunzător? –  > Por Giorgos Betsos.
  • Câte rânduri aveți în tabelul de sisteme? –  > Por zedfoxus.
  • @zedfoxus Aproximativ 5300 de rânduri. –  > Por Finley.
  • Sunt surprins că interogarea durează atât de mult! –  > Por zedfoxus.
  • Puteți arunca o privire la acest post –  > Por Giorgos Betsos.
3 răspunsuri
Michał Turczyn

Aceasta poate fi o problemă de performanță a unei interogări. O astfel de interogare secundară trebuie să fie executată pentru fiecare rând, astfel încât poate dura mult timp pentru a rula. Interogarea poate fi simplificată prin utilizarea group by:

select year, count(*) from systems
where Year is not null and systemtype = 'handled'
group by Year

UPDATE cu privire la comentariu:

dacă doresc să adaug mai multe coloane pentru diferite tipuri de sisteme, în afară de un singur tip?

Utilizați interogarea:

select year,
       sum(case when systemtype = 'handled' then 1 else 0 end) handled,
       sum(case when systemtype = 'console' then 1 else 0 end) console
from systems
where Year is not null
group by Year

Comentarii

  • Vă mulțumim pentru răspuns! Îmi pare rău că nu a fost mai clar, dar dacă vreau să adaug mai multe coloane pentru diferite tipuri de sisteme, altele decât cele de un singur tip? Are sens? Există o modalitate mai bună de a face acest lucru? –  > Por Finley.
  • Perfect! Este exact ceea ce aveam nevoie. Tocmai am încercat-o și a funcționat foarte bine. Vă mulțumesc foarte mult! –  > Por Finley.
scaisEdge

S-ar putea să aveți o problemă de domeniu de aplicare încercați să utilizați o îmbinare interioară în loc de o interogare secundară pentru fiecare rând

SELECT sys.Year, t.my_count
FROM systems as sys
INNER JOIN 
  ( SELECT Year, COUNT(*) my_count
    FROM systems
    WHERE SYSTEMTYPE = 'handheld' AND Year = sys.Year
    GROUP BY year
) t on t.year = sys.year
WHERE sys.Year IS NOT NULL 

Kevin HR

Utilizați declarația Group By în loc de subinterogări. Subinterogările vor face ca interogarea să ruleze mult mai lent pe măsură ce sunt adăugate mai multe rânduri. Încercați această interogare pentru a obține numărul de sisteme fabricate pe tip și pe an:

SELECT
    Year, 
    SYSTEMTYPE, 
    COUNT(*) as Total_systems_per_type_per_year
FROM systems
WHERE Year IS NOT NULL
GROUP BY Year, SYSTEMTYPE

Comentarii

  • Vă mulțumim pentru răspuns! Îmi pare rău că nu a fost mai clar, dar ce se întâmplă dacă vreau să adaug mai multe coloane pentru diferite numere de sisteme de diferite tipuri pe an? De exemplu, dacă aș adăuga un tip de console și aș dori ca și acest număr să fie inclus într-o coloană separată. Există o modalitate prin care aș putea face acest lucru? –  > Por Finley.
  • Probabil că va trebui să adăugați coloane manual, făcând ceva de genul acesta: SELECT Year, SUM(IF(SYSTEMTYPE='console',1,0)) as Total_console_per_year, SUM(IF(SYSTEMTYPE='handheld',1,0)) as Total_handheld_per_year FROM systems WHERE Year IS NOT NULL GROUP BY Year –  > Por Kevin HR.