首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >行和表之间的关系- mySQL

行和表之间的关系- mySQL
EN

Stack Overflow用户
提问于 2013-04-19 05:02:36
回答 3查看 651关注 0票数 2

我正在开发一个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特征的疾病?具体情况下是“偏头痛”吗?

示例:

代码语言:javascript
运行
复制
Characteristics – 1, 2 – return -> MIGRAINE
Characteristics – 1 – return > NOTHING
Characteristics – 1, 4, 5 – return > FLU
Characteristics – 1, 4 – return > NOTHING

如何进行返回具有这些特征的疾病的查询?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-19 05:07:24

代码语言:javascript
运行
复制
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
  • SQLFiddle演示
票数 1
EN

Stack Overflow用户

发布于 2013-04-19 05:39:38

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2013-04-19 06:30:27

代码语言:javascript
运行
复制
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);

或者,如果您想要使用特征名称,请改为:

代码语言:javascript
运行
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16097504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档