MySQL如何根據(jù)不同條件聯(lián)查不同表的數(shù)據(jù)if/case
MySQL根據(jù)不同條件聯(lián)查不同表的數(shù)據(jù)
項(xiàng)目開(kāi)發(fā)中遇到類(lèi)似的需求。Mybatis 中的< if >標(biāo)簽只能判斷where部分,不能滿(mǎn)足要求。
在網(wǎng)上查解決方法,好像并沒(méi)有可以完美解決問(wèn)題的方案,if和case可以從某一種角度實(shí)現(xiàn)效果。
if
MySQL中if的用法:
IF(expr1,expr2,expr3)
類(lèi)似三元運(yùn)算符,判斷expr1,如果 expr1 是TRUE,則該語(yǔ)句的返回值為expr2; 否則返回值為 expr3。
SELECT product_id, IF(product_type_id=1, (SELECT COUNT(*) FROM `device` WHERE product_id = product.product_id), (SELECT COUNT(*) FROM `monitor`WHERE product_id = product.product_id)) as device_num FROM `product` WHERE product_id in (1,25)
查product_id為(1,25)兩產(chǎn)品的設(shè)備數(shù)。
product表中字段product_type_id表示產(chǎn)品類(lèi)型。
如果是1就查device表,否則就查monitor表。
case
多于兩種情況時(shí)
case的用法
CASE expr1 WHEN a THEN A WHEN … THEN … ELSE … END
判斷expr1,滿(mǎn)足不同條件時(shí)執(zhí)行不同的語(yǔ)句。
注:最后以END結(jié)尾
SELECT product_id, CASE product_type_id WHEN 1 THEN (SELECT COUNT(*) FROM `device` WHERE product_id = product.product_id) WHEN 2 THEN (SELECT COUNT(*) FROM `monitor`WHERE product_id = product.product_id) ELSE (SELECT COUNT(*) FROM `other_device`WHERE product_id = product.product_id) END as device_num FROM `product` WHERE product_id in (1,11,25)
注意
這樣能勉強(qiáng)實(shí)現(xiàn)效果,但并不是想象的那種。
話說(shuō),這種情況是不是應(yīng)該先查出共同的部分,再在service層進(jìn)行判斷,執(zhí)行不同的語(yǔ)句。。
MySQL兩表聯(lián)查,根據(jù)不同條件獲得不同數(shù)據(jù)
場(chǎng)景:
查找某張表中某一列的所有符合某種條件的條目的累加和,且該表和另一張表相關(guān)聯(lián)
查詢(xún)語(yǔ)句
select DISTINCT ?? ifnull((select sum(‘列名') from a, b where a.id = b.id and a.condition=condition1 and b.condition = condition2),0) as '條件1下的數(shù)據(jù)' , ifnull((select sum(‘列名') from a, b where a.id = b.id and a.condition=condition3 and b.condition = condition4),0) as '條件2下的數(shù)據(jù)' from a, b where a.id = b.id?
缺點(diǎn):數(shù)據(jù)量一太大就會(huì)be崩潰
優(yōu)化后語(yǔ)句
select ‘別名1', ‘別名2' from? (select IFNULL(sum(‘列名'),0) ‘別名1' from a, b where a.id = b.id and a.condition=condition1 and b.condition = condition2),0) t1 left join? (select IFNULL(sum(‘列名'),0) ‘別名2' from a, b where a.id = b.id and a.condition=condition3 and b.condition = condition4) t2 on 1=1
left join查詢(xún)比select嵌套查詢(xún)效率高的原因:執(zhí)行子查詢(xún)時(shí),MYSQL需要?jiǎng)?chuàng)建臨時(shí)表,查詢(xún)完畢后再刪除這些臨時(shí)表,所以,子查詢(xún)的速度會(huì)受到一定的影響,這里多了一個(gè)創(chuàng)建和銷(xiāo)毀臨時(shí)表的過(guò)程。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- MySQL視圖中如何使用IF和CASE語(yǔ)句
- MySQL使用IF語(yǔ)句及用case語(yǔ)句對(duì)條件并結(jié)果進(jìn)行判斷?
- MySQL控制流函數(shù)(-if?,elseif,else,case...when)
- 深入淺析MySQL 中 Identifier Case Sensitivity問(wèn)題
- MySQL中的if和case語(yǔ)句使用總結(jié)
- MYSQL中有關(guān)SUM字段按條件統(tǒng)計(jì)使用IF函數(shù)(case)問(wèn)題
- mysql中IFNULL,IF,CASE的區(qū)別介紹
- Mysql CASE IF 判空的具體使用
相關(guān)文章
MySQL聯(lián)合查詢(xún)之輕松實(shí)現(xiàn)數(shù)據(jù)關(guān)聯(lián)詳解
MySQL中當(dāng)查詢(xún)數(shù)據(jù)來(lái)自多張表時(shí)需要用到關(guān)聯(lián)查詢(xún),下面這篇文章主要給大家介紹了關(guān)于MySQL聯(lián)合查詢(xún)之輕松實(shí)現(xiàn)數(shù)據(jù)關(guān)聯(lián)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06ubuntu系統(tǒng)中安裝mysql5.6(通過(guò)二進(jìn)制)
今天工作中需要對(duì)一臺(tái)ubantu的系統(tǒng)安裝mysql,因?yàn)橐郧耙恢笔褂玫氖莄entos,雖然它也是類(lèi)unix但是和redhat或centos命令上還是有點(diǎn)差別。所以通過(guò)網(wǎng)上查閱資料,終于安裝成功了,現(xiàn)在將步驟分享給大家,有需要的朋友們可以參考借鑒。2016-10-10MySQL億級(jí)數(shù)據(jù)平滑遷移雙寫(xiě)方案實(shí)戰(zhàn)
預(yù)約業(yè)務(wù)與其他業(yè)務(wù)數(shù)據(jù)表存儲(chǔ)在同一個(gè)數(shù)據(jù)庫(kù),當(dāng)其他業(yè)務(wù)出現(xiàn)慢SQL等異常時(shí),會(huì)影響到預(yù)約業(yè)務(wù),為了提高系統(tǒng)穩(wěn)定性和數(shù)據(jù)隔離性,需要將預(yù)約數(shù)據(jù)表從原來(lái)的數(shù)據(jù)庫(kù)中遷移出來(lái),單獨(dú)建立數(shù)據(jù)庫(kù),涉及到的讀寫(xiě)場(chǎng)景多,改造成本大,采用 Mybatis插件實(shí)現(xiàn)遷移所需的雙寫(xiě)等功能2024-08-08mysql使用mysqld_multi部署單機(jī)多實(shí)例的方法教程
這篇文章主要給大家介紹了關(guān)于mysql使用mysqld_multi部署單機(jī)多實(shí)例的相關(guān)資料,文中通過(guò)示例代碼將實(shí)現(xiàn)的步驟一步步介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03mysql連接數(shù)設(shè)置操作方法(Too many connections)
下面小編就為大家?guī)?lái)一篇mysql連接數(shù)設(shè)置操作方法(Too many connections)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03MySQL表數(shù)據(jù)文件損壞導(dǎo)致數(shù)據(jù)庫(kù)無(wú)法啟動(dòng)的原因與解決方案
在日常的數(shù)據(jù)庫(kù)管理中,遇到MySQL表數(shù)據(jù)文件損壞的情況并不罕見(jiàn),這種情況下,MySQL數(shù)據(jù)庫(kù)可能會(huì)無(wú)法正常啟動(dòng),給業(yè)務(wù)運(yùn)行帶來(lái)嚴(yán)重影響,本文將探討如何診斷和解決MySQL表數(shù)據(jù)文件損壞導(dǎo)致的數(shù)據(jù)庫(kù)無(wú)法啟動(dòng)問(wèn)題,需要的朋友可以參考下2025-03-03