如果记录存在MySQL查询,则匹配数组中的所有记录

时间:2013-07-05 13:43:07

标签: mysql codeigniter

我在数据库中有两个表。 1)tbl_lab_checkup 2)tbl_lab

tbl_lab拥有实验室的所有记录,tbl_lab_checkup具有实验室提供的所有记录。

以下是表格中的字段

1) tbl_lab_checkup
-- labcheckupid (pk)
-- labid (fk)
-- checkupid (fk)
-- cost
-- discount

2) tbl_lab

--  labid (pk)
-- labname
-- labarea (fk)

我有'areaid'= 1和'checkupid'在数组中我与“,”(1,2)联系。

我想要的是在areaid = 1中提供所有可用的实验室列表,他们提供数组中的所有检查(1,2)

我尝试了以下查询但是我得错了结果。

SELECT tlc .* FROM tbl_lab_checkup tlc
INNER JOIN tbl_lab lb ON 
tlc.labid = lb.labid
WHERE 
tlc.checkupid IN (1,2) AND lb.labarea=1
GROUP BY lb.labid

即使lab在数组中只提供一个id,它也会返回结果。任何人都有解决方案。

检查小提琴:http://sqlfiddle.com/#!2/5c674/1

3 个答案:

答案 0 :(得分:4)

如果您已构建此查询,则可以添加如下的having子句:

SELECT tlc .* FROM tbl_lab_checkup tlc
INNER JOIN tbl_lab lb ON 
tlc.labid = lb.labid
WHERE 
tlc.checkupid IN (1,2) AND lb.labarea=1 
GROUP BY lb.labid 
having count(tlc.checkupid) = 2;

此处having count(tlc.checkupid) = 2; 2值是tlc.checkupid IN (1,2)中元素的计数。

如果您想distinct tlc.checkupid,可以将having count(tlc.checkupid) = 2切换为having count(distinct tlc.checkupid) = 2;

答案 1 :(得分:3)

使用此代码在CI中获得所需的结果:

$this->db->select("tbl_lab.*");    
$this->db->join("tbl_lab_checkup","tbl_lab_checkup.labid = tbl_lab.labid");   
$this->db->where("tbl_lab.labarea","1");
$find="FIND_IN_SET('1,2','tbl_lab_checkup.checkupid')";
$this->db->where($find);
$this->db->get("tbl_lab");

答案 2 :(得分:1)

我通常会按照vinodadhikary的建议行事,但另一种选择是每次检查使用一次JOIN: -

SELECT lb.*
FROM tbl_lab lb
INNER JOIN tbl_lab_checkup tlc1 ON tlc1.labid = lb.labid AND tlc1.checkupid = 1
INNER JOIN tbl_lab_checkup tlc2 ON tlc2.labid = lb.labid AND tlc2.checkupid = 2
WHERE lb.labarea=1 

当您需要所有tbl_lab_checkup记录详细信息

时,这将有效