我在数据库中有两个表。 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,它也会返回结果。任何人都有解决方案。
答案 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记录详细信息
时,这将有效