如何在MySQL JOIN的同一列中搜索多个值?

时间:2018-12-06 15:02:26

标签: mysql

我已尽力解释我的问题。请仔细回答我的问题,以了解我想要实现的目标。

我正在尝试在MySQL的同一列中搜索多个值。我在此操作中使用了以下4个表:

联系人:

enter image description here

数据值:

enter image description here

数据字段:

enter image description here

data_cats_options:

enter image description here

在我的网站前端,过滤器(用于搜索所需数据的表单元素)如下所示:

enter image description here

enter image description here

单个下拉(国家/地区)搜索:

要获取“国家/地区”为“印度”的所有名称为“ Sachin”的联系人,我使用以下查询:

SELECT `c`.* 
FROM `contacts` AS `c` JOIN `data_values` AS `dv` 
ON `c`.`contact_id` = `dv`.`contact_id` 
JOIN `data_fields` AS `df` ON 
`dv`.`field_id` = `df`.`field_id` 
JOIN `data_cats_options` AS `dco` ON 
`dv`.`field_val` = `dco`.`val_id`  
WHERE `c`.`contact_name` = "Sachin" AND `dv`.`field_id` = 153 AND `dco`.`val_id` = 224

类似地,我们可以为会计“工作”下拉菜单的所有“萨钦”做事。

问题

我真的不知道如何搜索多个数据,例如如何使用“国家/地区”为“印度”且“工作”为“会计”的“ Sachin”获取所有联系人。尽管数据库中存在数据,但以下SQL没有任何结果:

SELECT `c`.* 
FROM `contacts` AS `c` JOIN `data_values` AS `dv` 
ON `c`.`contact_id` = `dv`.`contact_id` 
JOIN `data_fields` AS `df` ON 
`dv`.`field_id` = `df`.`field_id` 
JOIN `data_cats_options` AS `dco` ON 
`dv`.`field_val` = `dco`.`val_id`  
WHERE `c`.`contact_name` = "Sachin" AND `dv`.`field_id` = 153 AND `dco`.`val_id` = 224 
AND `dv`.`field_id` = 154 AND `dco`.`val_id` = 227

我主要关心的是上面查询的这一特定部分:

AND `dv`.`field_id` = 153 AND `dco`.`val_id` = 224 
AND `dv`.`field_id` = 154 AND `dco`.`val_id` = 227

那么我们如何在此JOIN的同一列中搜索多个数据?

我真的想获取同时满足两个下拉选项的所有记录。

请帮助我。预先感谢。

1 个答案:

答案 0 :(得分:0)

这似乎是一个糟糕的设计,因为我们必须添加其他联接。

finish_thing()

我仍在考虑其他选择,但需要做点其他事情。

也许...将根据要搜索的field_ID的数量动态设置2;您知道这是因为您有field_ID ...

SELECT c.* 
FROM contacts AS c 
JOIN data_values AS dv 
  ON c.contact_id = dv.contact_id 
JOIN data_fields AS df 
  ON dv.field_id = df.field_id 
JOIN data_cats_options AS dco 
  ON dv.field_val = dco.val_id 
JOIN data_values AS dv2 
  ON c.contact_id = dv2.contact_id 
JOIN data_fields AS df2 
  ON dv2.field_id = df2.field_id 
JOIN data_cats_options AS dco2 
  ON dv2.field_val = dco2.val_id 
WHERE c.contact_name = "Sachin" 
  AND dv.field_id = 153 AND dco.val_id = 224 
  AND dv2.field_id = 154 AND dco2.val_id = 227

为什么行得通?因为我们知道如果两个匹配都发生,那么如果每个contact_ID不存在,我们将获得2条记录,而我们只会获得1条记录。因此拥有让我们限制了期望的方式。

或者我们可以使用 HAVING COUNT()=(从data_Fields中选择count(),其中('153','154')中的field_ID)