問題
1. 查詢條件不同,返回多個結果整合
在查詢的時候,有時候常常須要用到子查詢,好比查詢今天的訂單數量, 7天的訂單數量,31天的訂單數量, 這種條件不同,可是非要整在一個表中來顯示就須要不少子查詢來實現了:java
select(select xx from xx where 條件一) as 結果一, select(select xx from xx where 條件二) as 結果二, select(select xx from xx where 條件三) as 結果三
這個時候咱們須要在一條sql將這三個結果查出來,可使用UNION和UNION ALLmysql
UNION 用於合併兩個或多個 SELECT 語句的結果集,並消去表中任何重複行。當 ALL 隨 UNION 一塊兒使用時(即 UNION ALL),不消除重複行sql
也就是咱們能夠拼成一個表,好比如今有這麼一個表:數組
若是咱們須要分別查出年齡小於18和大於18的人數,因爲查詢條件不同,因此須要用到兩個查詢函數
SELECT COUNT(*) FROM USER WHERE age < 18 ; SELECT COUNT(*) FROM USER WHERE age >= 18 ;
使用UNION:code
SELECT * FROM (SELECT COUNT(*) FROM USER WHERE age < 18 UNION SELECT COUNT(*) FROM USER WHERE age >= 18) a
可是查出來的結果是在一列裏面,沒法得知哪一個是18如下的字符串
咱們能夠拼接一個0使其爲兩個字段(兩列),這裏注意兩條子查詢的別名都要同樣string
SELECT * FROM (SELECT COUNT(*) AS '18如下人數', 0 AS '18以上人數' FROM USER WHERE age < 18 UNION SELECT 0 AS '18如下人數', COUNT(*) AS '18以上人數' FROM USER WHERE age >= 18) a
這個時候是兩條記錄,分別使用SUM獲得總數就能夠變成一條記錄了it
2. 查詢條件同樣,返回多個結果整合
可是有時候, 幾個結果的條件是同樣的, 可是子查詢只能返回一個結果, 也就是咱們須要分紅多個子查詢來查詢相同的條件table
SELECT(SELECT xx FROM xx WHERE 條件一) AS 結果一, SELECT(SELECT xx FROM xx WHERE 條件一) AS 結果二, SELECT(SELECT xx FROM xx WHERE 條件一) AS 結果三, SELECT(SELECT xx FROM xx WHERE 條件二) AS 結果四
處理
在網上搜羅一圈後, 有一個解決辦法挺新穎的, 大概就是先把一樣條件的多個結果, 先拼接成一個, 再在外面進行拆分, 在java裏面好比是"aa,bb,cc".split(",")
select SUBSTRING_INDEX(temp.結果一,',',1) as 第一列數據, SUBSTRING_INDEX(SUBSTRING_INDEX(temp.結果一,','2),',',-1) as 第二列數據, SUBSTRING_INDEX(temp.結果一,','-1) as 第三列數據, temp.結果二 as 第四列數據 FROM( select(select concat_ws(',',數據一, 數據二,數據三) from xx where 條件一) as 結果一, select(select xx from xx where 條件二) as 結果二 )temp
[補充]關於substring_index的用法
SUBSTRING_INDEX('待切割的字符串', '截取分割的字符,好比逗號' , 長度)
長度爲負數,從右邊開始, 好比"a,b,c,d", 長度爲-1取得是"d"(能夠理解爲在java中,利用split分割以後,取數組中的前幾個元素)
取a: SUBSTRING_INDEX("a,b,c,d" , "," , 1) 取b: SUBSTRING_INDEX(SUBSTRING_INDEX("a,b,c,d" , "," , 2) ,",",-1) 先拿到前2位,再取最後一位 取d: SUBSTRING_INDEX("a,b,c,d" , "," , -1) 取cd: SUBSTRING_INDEX("a,b,c,d" , "," , -2)
示例1:
SELECT SUBSTRING_INDEX(temp.today, ",", 1) AS `今日加購量`, SUBSTRING_INDEX(temp.today, "," ,- 1) AS `今日加購商家數` FROM ( SELECT CONCAT_WS( ',', COUNT(*), COUNT(DISTINCT c.MALL_STORE_ID) ) AS today FROM mall_goods_cart c WHERE STR_TO_DATE(c.CREATE_TIME, '%Y-%m-%d') = CURDATE() ) AS temp
mysql日期函數函數:
SELECT NOW(),CURDATE(),CURTIME()
NOW() | CURDATE() | CURTIME() |
---|---|---|
2008-12-29 16:25:46 | 2008-12-29 | 16:25:46 |
示例2:需求:關聯查詢另外一個大表數據的某些(一個以上)字段
方案:因關聯查詢的表數據太大。多表查詢影響效率,單個子查詢又有些多餘。因此採用多列拼接子查詢,而後根據SUBSTRING_INDEX(SOURCE,SEPARETOR,INDEX+1)。
原理:子查詢返回拼接列;函數截取還原列
SELECT SUBSTRING_INDEX(temp.temp_column,",",1) showFirst, SUBSTRING_INDEX(temp.temp_column,",",-1) showOver, SUBSTRING_INDEX(SUBSTRING_INDEX(temp.temp_column,',',2),',',-1) showTwo, temp.* FROM ( SELECT ( SELECT CONCAT_WS(',','12','23','34','45')) temp_column ) temp;
固然,若是僅僅只是在返回的多行數據之中隨便抽取一列便可,可使用limit,,找到一個符合條件的就能夠了
select * from table1 where table1.colums=(select columns from table2 limit 1);
或者使用any函數:
select * from table1 where table1.colums=any(select columns from table2);