2015-11-19 31 views
0

我覺得我在服用瘋狂的藥丸。返回表格中包含兩個值的行

我有一個表problems。它看起來像:

id | pid | problem_list_id 
----------------------------------- 
1 | 159 | 16 
2 | 159 | 4 
3 | 10 | 16 
4 | 565 | 90 
5 | 565 | 4 
6 | 122 | 12 

我想查詢pid有和兩個16 PROBLEM_ID 4.

SELECT 
    YEAR(pbd.date_created), 
    COUNT(*) 
FROM 
    patient_booking_data pbd inner join problems p on pbd.pid = p.pid 
WHERE p.problem_list_id in (16,4) 
GROUP BY YEAR(pbd.date_created) 
ORDER BY YEAR(pbd.date_created) 

這顯然會打16或4。我需要的PID與同時16和4.

當我嘗試使用:

WHERE (p.problem_list_id = 16 AND p.problem_list_id = 4) 

這不會產生任何結果。

我可以使用類似:

SELECT 
    YEAR(pbd.date_created), 
    COUNT(*) 
FROM 
    patient_booking_data pbd inner join problems p on pbd.pid = p.pid 
WHERE p.problem_list_id = 16 
     AND pbd.pid in (SELECT pid FROM problems where problem_list_id = 4) 
GROUP BY YEAR(pbd.date_created) 
ORDER BY YEAR(pbd.date_created) 

但使用嵌套select似乎有點小題大做。

我錯過了一些明顯的東西嗎?

回答

2

我不知道爲什麼你的查詢不同於你的數據表嗎?

但與數據表使用HAVING COUNT()

SELECT pid 
FROM problems 
WHERE problem_list_id in (16,4) 
GROUP BY pid 
HAVING COUNT(DISTINCT problem_list_id) = 2 

我使用的情況下,不同的一個PID調節的16 or 2 muliple occurence否則只是COUNT(*)將足以

也許你需要這樣的事情。先用cte計算pid然後返回patient_booking

WITH cte as (
    SELECT pid 
    FROM problems 
    WHERE problem_list_id in (16,4) 
    GROUP BY pid 
    HAVING COUNT(DISTINCT problem_list_id) = 2 
) 
SELECT 
    YEAR(pbd.date_created), 
    COUNT(*) 
FROM patient_booking_data pbd 
JOIN CTE c on pbd.pid = c.pid 
GROUP BY YEAR(pbd.date_created) 
ORDER BY YEAR(pbd.date_created) 
相關問題