2

我在数据库中有两个表。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)

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

我想要的是获取 areaid=1 中所有可用的 lablist,他们在数组中提供所有检查 (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

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

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

4

3 回答 3

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) = 2having count(distinct tlc.checkupid) = 2;

于 2013-07-05T13:53:36.193 回答
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");
于 2013-07-06T07:28:45.060 回答
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 记录详细信息时,这将起作用

于 2013-07-05T14:20:40.713 回答