MySQL中使用INNER JOIN來實現Intersect並集操作
阿新 • • 發佈:2017-05-13
int isam har 業務 charset tin ner get 一句話
RESOURCE_ID是資源的唯一標識
當是且關系時,這裏並不能簡單的將ORkeyword換成AND。須要先把滿足每一個屬性的資源查出來。再取並集
第一句話會查出表中全部的資源ID
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。並和前面的查詢結果取交集
這樣,還能夠繼續加其它的屬性
復制去Google翻譯翻譯結果 或MySQL中使用INNER JOIN來實現Intersect並集操作