2015-06-09 100 views
0

如何讓mysql請求選擇包含列表的所有元素的所有值。 我的表是這樣的:mysql選擇與列表中所有元素一致的值

+--------+------------+ 
| carID | serviceID | 
+--------+------------+ 
| 1 |  12 | 
+--------+------------+ 
| 1 |  13 | 
+--------+------------+ 
| 1 |  15 | 
+--------+------------+ 
| 2 |  12 | 
+--------+------------+ 
| 3 |  13 | 
+--------+------------+ 
| 3 |  15 | 
+--------+------------+ 

我提出的要求,如:

SELECT `carID` FROM `car_services` WHERE `carID` in (1, 2, 3) AND `serviceID` in (12, 13, 15); 

但它返回所有的車,但我需要的只是carID = 1車,因爲只有這款車適合條件(支持所有服務12,13,15)。

任何想法?

+0

是serviceid對carid唯一嗎? –

回答

1

一個簡單的方法是group byhaving

SELECT `carID` 
FROM `car_services` 
WHERE `carID` in (1, 2, 3) AND `serviceID` in (12, 13, 15) 
group by carID 
having count(*) = 3 
; 
+0

它很簡單,適合我。謝謝! –

0

使用GROUP BYHAVING條款:

SELECT `carID` 
FROM `car_services` 
WHERE `carID` in (1, 2, 3) 
GROUP BY `carID` 
HAVING SUM(CASE WHEN `serviceID` in (12,13,15) THEN 1 ELSE 0 END)=3 
0

使用複合where子句逐個檢查EXISTS是非常簡單的,而不是依賴於獨特性的serviceid - carid關係。我在查看查詢計劃/執行成本之前,如果它獨特,在決定實際上比分組解決方案更好之前。

SELECT carID 
    FROM car_services a 
WHERE EXISTS (SELECT 1 FROM car_services b WHERE a.carID = b.car_id AND serviceID = 12) 
    AND EXISTS (SELECT 1 FROM car_services b WHERE a.carID = b.car_id AND serviceID = 13) 
    AND EXISTS (SELECT 1 FROM car_services b WHERE a.carID = b.car_id AND serviceID = 15) 

注意:這顯然不適合大量所需的服務。

0

您可以使用GROUP_CONCAT

SELECT carID 
FROM (
    SELECT carID, 
     GROUP_CONCAT(DISTINCT serviceID ORDER BY serviceID) AS allServices 
    FROM car_services 
    WHERE serviceID in (12, 13, 15) 
    GROUP BY carID) t 
WHERE allServices = "12,13,15"; 

即使你serviceID領域有重複這樣的工作。

相關問題