1. 程式人生 > >MySQL中使用INNER JOIN來實現Intersect並集操作

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

int isam har 業務 charset tin ner get 一句話

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並集操作