MySQL
UNION
Sök…
Syntax
- UNION DISTINCT - deduktioner efter kombination av SELECT
- UNION ALL - icke dedup (snabbare)
- UNION - standard är DISTINCT
- VÄLJ ... UNION VÄLJ ... - är OK, men tvetydig med
ORDER BY
- (VÄLJ ...) UNION (VÄLJ ...) BESTÄLLNING AV ... - löser tvetydigheten
Anmärkningar
UNION använder inte flera CPU: er.
UNION involverar alltid en temptabell för att samla in resultaten. * Från och med 5.7.3 / MariaDB 10.1 levererar vissa former av UNION resultaten utan att använda en tmp-tabell (därmed snabbare).
Kombinera SELECT uttalanden med UNION
Du kan kombinera resultaten från två identiskt strukturerade frågor med sökordet UNION
.
Om du till exempel ville ha en lista med all kontaktinformation från två separata tabeller, authors
och editors
, till exempel, kan du använda UNION
sökordet så:
select name, email, phone_number
from authors
union
select name, email, phone_number
from editors
Att använda union
sig kommer att ta bort dubbletter. Om du behövde behålla duplikat i din fråga kan du använda ALL
nyckelordet så: UNION ALL
.
SORTERA EFTER
Om du behöver sortera resultaten från en UNION, använd detta mönster:
( SELECT ... )
UNION
( SELECT ... )
ORDER BY
Utan parenteser skulle den sista ORDER BY tillhöra den sista VÄLJ.
Pagination via OFFSET
När du lägger till en BEGRÄNSNING till en UNION är detta mönstret att använda:
( SELECT ... ORDER BY x LIMIT 10 )
UNION
( SELECT ... ORDER BY x LIMIT 10 )
ORDER BY x LIMIT 10
Eftersom du inte kan förutsäga vilka VÄLJ (er) kommer "10" kommer från, måste du få 10 från vardera, sedan vidare nedför listan, upprepa både ORDER BY
och LIMIT
.
För den fjärde sidan av 10 artiklar behövs detta mönster:
( SELECT ... ORDER BY x LIMIT 40 )
UNION
( SELECT ... ORDER BY x LIMIT 40 )
ORDER BY x LIMIT 30, 10
Det vill säga, samla in 4 sidor i varje SELECT
och gör sedan OFFSET
i UNION
.
Kombinera data med olika kolumner
SELECT name, caption as title, year, pages FROM books
UNION
SELECT name, title, year, 0 as pages FROM movies
När du kombinerar två postuppsättningar med olika kolumner, emulera sedan de saknade med standardvärden.
UNION ALL och UNION
VÄLJ 1,22,44 UNION SELECT 2,33,55
VÄLJ 1,22,44 UNION VÄLJ 2,33,55 UNION VÄLJ 2,33,55
Resultatet är detsamma som ovan.
använd UNION ALL
när
VÄLJ 1,22,44 UNION VÄLJ 2,33,55 UNION ALLA VÄLJ 2,33,55
Kombinera och slå samman data på olika MySQL-tabeller med samma kolumner i unika rader och körfråga
Denna UNION ALL kombinerar data från flera tabeller och fungerar som ett tabellnamnalias för dina frågor:
SELECT YEAR(date_time_column), MONTH(date_time_column), MIN(DATE(date_time_column)), MAX(DATE(date_time_column)), COUNT(DISTINCT (ip)), COUNT(ip), (COUNT(ip) / COUNT(DISTINCT (ip))) AS Ratio
FROM (
(SELECT date_time_column, ip FROM server_log_1 WHERE state = 'action' AND log_id = 150) UNION ALL
(SELECT date_time_column, ip FROM server_log_2 WHERE state = 'action' AND log_id = 150) UNION ALL
(SELECT date_time_column, ip FROM server_log_3 WHERE state = 'action' AND log_id = 150) UNION ALL
(SELECT date_time_column, ip FROM server_log WHERE state = 'action' AND log_id = 150)
) AS table_all
GROUP BY YEAR(date_time_column), MONTH(date_time_column);