MySQL中使用INNER JOIN來實現Intersect並集操作


MySQL中使用INNER JOIN來實現Intersect並集操作


一、業務背景

我們有張表設計例如以下:

CREATE TABLE `user_defined_value` (
  `RESOURCE_ID` varchar(20) DEFAULT NULL,
  `COLUMN_NAME` varchar(20) DEFAULT NULL,
  `VALUE` varchar(255) DEFAULT NULL,
  KEY `ID_IDX` (`RESOURCE_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

RESOURCE_ID是資源的唯一標識

COLUMN_NAME是資源的一個屬性名稱

VALUE是資源的屬性值


二、需求

如今須要從表中查出屬性A='1'且屬性B='2'的資源ID


三、分析

這里須要查的是同一時候滿足兩個屬性的資源ID,假設是或的關系,那么SQL會非常easy

SELECT DISTINCT RESOURCE_ID FROM USER_DEFINED_VALUE 
WHERE (COLUMN_NAME = 'A' AND VALUE in ('1'))  
OR (COLUMN_NAME = 'B' AND VALUE in ('2'))

當是且關系時,這里並不能簡單的將ORkeyword換成AND。須要先把滿足每一個屬性的資源查出來。再取並集

在百度上查到SQL Server和Oracle都支持Intersect。能夠直接將兩個同樣結構的查詢結果取交集,而MySQL並沒有Intersectkeyword。那么我們能夠怎樣實現呢?


四、使用INNER JOIN xxx USING xxx

SELECT DISTINCT RESOURCE_ID FROM USER_DEFINED_VALUE 
INNER JOIN (SELECT DISTINCT RESOURCE_ID FROM USER_DEFINED_VALUE WHERE  (COLUMN_NAME = 'A' AND VALUE in ('1')) ) t0 USING (RESOURCE_ID) 
INNER JOIN (SELECT DISTINCT RESOURCE_ID FROM USER_DEFINED_VALUE WHERE  (COLUMN_NAME = 'B' AND VALUE in ('2')) ) t1 USING (RESOURCE_ID)

第一句話會查出表中全部的資源ID

第二句話或查出屬性A='1'的資源ID,並和第一句話的查詢結果取交集

第三句話或查出屬性B='2'的資源ID。並和前面的查詢結果取交集

這樣,還能夠繼續加其它的屬性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM