sql >> Databasteknik >  >> RDS >> Mysql

MYSQL - Skapa en sql-fråga från flera sökfrågor

Teknik 1:Kombinera skalärer:

SELECT a ... LIMIT 1;
SELECT b ... LIMIT 1;

-->

SELECT
    ( SELECT a ... LIMIT 1) AS a,
    ( SELECT b ... LIMIT 1) AS b ;

Om a är ungefär COUNT(*) , då vet du att det blir exakt ett resultat; därav LIMIT 1 är onödigt.

Om en av dessa underfrågor kanske inte returnerar några rader får du NULL .

Teknik 2:En select kan användas nästan överallt där ett uttryck kan användas. Ovanstående är tekniskt sett ett exempel på sådant. Också...

SELECT ... WHERE x = ( SELECT ... ) ...

Återigen måste underfrågan returnera en enda rad för att göra det möjligt.

SELECT ...
    WHERE x LIKE CONCAT('%', ( SELECT ... ), '%')
    ...;

Det blir ungefär så här efter att underfrågan har utvärderats:

SELECT
    WHERE x LIKE '%foo%'
    ...;

(Det är inte effektivt, men det fungerar.)

Dessa 3 är lika, men inte nödvändigtvis effektiva som varandra:

SELECT ...
    WHERE x IN ( SELECT ... )

SELECT ... FROM A
    WHERE EXISTS( SELECT ... FROM B
                  WHERE B.x = A.x )

SELECT ... FROM A JOIN B ON B.x = A.x

Detta är liknande men hittar de matchande objekten som saknas från B:

SELECT ... FROM A LEFT JOIN B ON B.x = A.x
    WHERE B.id IS NULL
    

UNION ska användas för frågor som har liknande utdata:

SELECT x,y FROM A
UNION
SELECT x,y FROM B

Det ger valfritt antal rader från A och valfritt antal rader från B. Dubletter tas bort om du använder UNION DISTINCT , eller behålls om du använder UNION ALL .

ORDER BY ... LIMIT ... blir knepigt. OFFSET blir ännu knepigare.

Prestanda

Dessa föremål är förmodligen viktigare (för prestanda) än att kombinera påståendena. Se https://meta.stackexchange.com/questions/ 66377/what-is-the-xy-problem



  1. MySQL Workbench ignorerar främmande nycklar

  2. PDO Multi-query SQLSTATE[HY000]:Allmänt fel

  3. Subtrahera lite datum och tid från aktuellt datum och tid för att hitta ålder i PHP

  4. Slå ned väggarna! Hur du tar bort dina data