Mysql
 sql >> Database >  >> RDS >> Mysql

MYSQL:crea una singola query sql da più query

Tecnica 1:Combinazione di scalari:

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

-->

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

Se a è qualcosa come COUNT(*) , allora sai che ci sarà esattamente un risultato; da qui il LIMIT 1 non è necessario.

Se una di queste sottoquery potrebbe non restituire alcuna riga, ottieni NULL .

Tecnica 2:una selezione può essere utilizzata quasi ovunque sia possibile utilizzare un'espressione. Quanto sopra è, tecnicamente, un esempio di tale. Inoltre...

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

Anche in questo caso, la sottoquery deve restituire una singola riga per renderlo possibile.

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

Diventa qualcosa del genere dopo che la sottoquery è stata valutata:

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

(Non è efficiente, ma funziona.)

Questi 3 sono simili, ma non necessariamente efficienti l'uno con l'altro:

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

Questo è simile ma trova gli elementi corrispondenti che sono mancanti da B:

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

UNION dovrebbe essere utilizzato per query con output simile:

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

Ciò produrrà un numero qualsiasi di righe da A e un numero qualsiasi di righe da B. I duplicati vengono rimossi se usi UNION DISTINCT o conservato se utilizzi UNION ALL .

ORDER BY ... LIMIT ... diventa complicato. OFFSET diventa ancora più complicato.

Prestazioni

Questi elementi sono probabilmente più importante (per la performance) che combinare le affermazioni insieme. Vedi https://meta.stackexchange.com/questions/ 66377/qual-è-il-problema-xy