Mysql 选择匹配不同值的行以检索公共字段

Mysql 选择匹配不同值的行以检索公共字段,mysql,search,join,criteria,Mysql,Search,Join,Criteria,我把桌子摆好了 id plan_id name rule 1 3 dep 4 2 3 sta 3 5 4 pri 7 6 1 dep 4 可读的图例;dep=部门,sta=状态,pri=优先级 我的想法是要检索与指定条件匹配的“plan_id”。我尝试了许多我认为可行的不同查询。这是最近的。我正试图找出如何最好地构造查询。尽管我想知道是否有更好的方法来编写这个查询。在某些情况下,可能只需要匹配部门。在其他情况下,我

我把桌子摆好了

id plan_id name rule
1     3    dep    4
2     3    sta    3
5     4    pri    7
6     1    dep    4
可读的图例;dep=部门,sta=状态,pri=优先级

我的想法是要检索与指定条件匹配的“plan_id”。我尝试了许多我认为可行的不同查询。这是最近的。我正试图找出如何最好地构造查询。尽管我想知道是否有更好的方法来编写这个查询。在某些情况下,可能只需要匹配部门。在其他情况下,我可能需要匹配所有三个或两个

在这个场景中,我希望找到同时包含状态和部门的计划。我需要它来匹配状态==3和部门==4。下面的代码应为计划id返回“3”

SELECT o.plan_id AS s_id
FROM `plan_criteria` o
LEFT JOIN plan_criteria pc
ON pc.plan_id=o.plan_id
WHERE (o.name IN ('sta') AND o.rule_match=3)
AND (pc.name IN ('dep') AND pc.rule_match=4)
编辑--


一个计划也可以包含多个部门/状态/优先级。

您不需要执行联接,只需使用适当的where子句执行“选择不同的计划id…”。我也会重新审视你的逻辑。你是说:

((pc.rule=3和pc.rule=4)或(pc.name='sta'和pc.name='dep'))

在这种情况下,结果集为3和1

再编辑一次:-)仔细看,如果“name”列确实包含值“department”、“status”和“priority”,则可能需要将这些值作为列重新设计表。像这样的查询真的不应该是什么大问题,您只需要正确地布局表

SELECT o_plan_id 
FROM `plan_criteria`  
WHERE `o_name` = "sta" 
    AND `rule_match` = "3" 
    AND `pc_name` = 'dep'
    AND `pc_rule_match` = '4'

我将两者结合在一起,只需使用表中的o_u和pc_u来简化内容。只要你的桌子不要太疯狂

我就做了编辑。例如我想找到同时包含状态和部门的计划。我需要它来匹配状态==3和部门==4。因此,(name='sta'和rule='3')和(name='dep'和rule='4')