我正在开发一个PHP + MySQL项目,需要知道如何进行一个SQL查询。下面是一张桌子上的草图:
1.jpg
ms_diseases
表存储疾病名称。ms_characteristics
存储可能来自某种疾病的特征。ms_diseases_characteristics
表交叉疾病与特征的关系
这里就是一个例子:
1.jpg
偏头痛(ms_diseases
)在ms_diseases_characteristics
表中具有数字1和2的特征。
现在的问题是:如何使用值1和值2返回具有1和2特征的疾病?具体情况下是“偏头痛”吗?
示例:
Characteristics – 1, 2 – return -> MIGRAINE
Characteristics – 1 – return > NOTHING
Characteristics – 1, 4, 5 – return > FLU
Characteristics – 1, 4 – return > NOTHING
如何进行返回具有这些特征的疾病的查询?
发布于 2013-04-19 05:07:24
SELECT disease_name
FROM
(
SELECT a.disease_name, c.totalCount
FROM ms_diseases a
INNER JOIN ms_diseases_characteristics b
ON a.ID = b.disease_ID
INNER JOIN
(
SELECT disease_ID, COUNT(*) totalCount
FROM ms_diseases_characteristics
GROUP BY disease_ID
) c ON b.disease_ID = c.disease_ID
WHERE b.characteristic_id IN (1,4,5) -- <<== list of charateristics
GROUP BY a.disease_name ^^
HAVING COUNT(*) = c.totalCount AND ^^
COUNT(DISTINCT b.characteristic_id) = 3 -- << # of parameters
) s
发布于 2013-04-19 05:39:38
SELECT CASE WHEN A.COUNT = B.FOUND_DISES THEN M.DISEASE_NAME ELSE 'NOT FOUND' END AS DISEASE
FROM
(
SELECT COUNT(*) AS COUNT, DISEASE_ID
FROM MS_DISEASES_CHARACTERISTICS
GROUP BY DISEASE_ID
) A
JOIN
(
SELECT COUNT(*) AS FOUND_DISES, DISEASE_ID
FROM MS_DISEASES_CHARACTERISTICS
WHERE CHARACTERISTIC_ID IN (<VALUE YOU PASS>)
GROUP BY DISEASE_ID
) B
ON WHERE A.DISEASE_ID = B.DISEASE_ID
JOIN MS_DISEASES AS M
ON D.ID = A.DISEASE_ID
发布于 2013-04-19 06:30:27
SELECT disease_name
FROM ms_diseases
WHERE id = (SELECT disease_id FROM (
SELECT disease_id, count(disease_id) CT
FROM
ms_diseases_characteristics AS dc,
ms_characteristics AS c
WHERE
c.id = dc.characteristic_id AND
c.id IN (1, 2)
GROUP BY disease_id
ORDER BY CT DESC) temp LIMIT 1);
或者,如果您想要使用特征名称,请改为:
SELECT disease_name
FROM ms_diseases
WHERE id = (SELECT disease_id FROM (
SELECT disease_id, count(disease_id) CT
FROM
ms_diseases_characteristics AS dc,
ms_characteristics AS c
WHERE
c.id = dc.characteristic_id AND
c.characteristic_name IN ('Headache','Frequent pain')
GROUP BY disease_id
ORDER BY CT DESC) temp LIMIT 1);
https://stackoverflow.com/questions/16097504
复制相似问题