MySQL PHP查询返回指定的结果,而不是所有需要的行

时间:2017-07-17 07:08:03

标签: php mysql sql

我有3个主要表格来获取有关药物的数据。

第一个表是药物清单t3

enter image description here

t3包含药物ID及其名称。其他信息现在不符合条件。

请暂时专注于med_id = 16

表med_pharmacy t1是我们的库存中存在药物的地方,它会出现在其中。目前我只有2只med_id = 16的股票:

enter image description here

第三个表consult_med t2是我可以收集有关该药物给药量的数据的地方,但在这里,t1.med_pharmacy_id是其中的FK:

enter image description here

现在,在我的PHP页面中,我有下表:

      <tr class="bg-info" id="after_tr">
          <th>Med ID</th>
          <th>Med Name</th>
          <th>Med Expiry</th>
          <th>Barcode</th>
          <th>received</th>
          <th>Pills received</th>
          <th>Date Received</th>
          <th>Pills distributed</th>
          <th>Still (in tablets)</th>
          <th>Still (in pills)</th>
        </tr>
        <?php foreach($fetchRes as $res) { ?>
        <tr id="<?php echo $res['med_id'] ?>">
          <td><?php echo $res['med_id'] ?></td>
          <td><?php echo $res['med_name'] ?></td>
          <td><?php echo $res['med_expiry'] ?></td>
          <td><?php echo $res['med_barcode'] ?></td>
          <td><?php echo $res['med_tablet'] ?></td>
          <td><?php echo $res['med_pill'] ?></td>
          <td><?php echo $res['med_received'] ?></td>
          <td><?php echo $res['given_pills'] ?></td>
          <td><?php echo floor($res['still_tablets'])?> (Exact:<?php echo number_format($res['still_tablets'], 2) ?>)</td>
          <td><?php echo $res['still_pills'] ?></td>
        </tr>
        <?php } ?>

哪个效果很好,但不是显示med_id = 16的第二个平板电脑有still_pills = 100而且没有给这个平板电脑上有不同条形码的人提供任何药片。它仅显示已经使用并提供给患者的药物清单:

enter image description here

这是我使用的查询

$clinic_id = $_SESSION['clinic_id'];
$getRes = "SELECT t1.med_id, t1.med_pharmacy_id,
t3.med_name,
t1.med_expiry, 
t1.med_barcode, 
t1.med_tablet, 
t1.med_pill, 
t1.med_received,
sum(t2.given_quantity) as given_pills,
t1.med_tablet - ((sum(t2.given_quantity)*t1.med_tablet)/t1.med_pill) as still_tablets,
(t1.med_pill-sum(t2.given_quantity)) as still_pills
FROM med_pharmacy t1, consultation_med t2, medication t3 WHERE t1.med_pharmacy_id = t2.med_pharmacy_id AND t1.med_id=t3.med_id
AND t1.clinic_id=:cid GROUP BY t1.med_pharmacy_id, t1.med_expiry,t1.med_barcode,t1.med_tablet,t1.med_pill,t1.med_received";
$execGetRes = $conn->prepare($getRes);
$execGetRes->bindValue(':cid', $clinic_id);
$execGetRes->execute();

2 个答案:

答案 0 :(得分:1)

问题是你是同时从3张桌子中选择的,这样可以防止你看到药物,如果它至少没有给过一次......相反,选择诊所里的所有股票,加入交易。

SELECT t1.med_id, t1.med_pharmacy_id,
t3.med_name,
t1.med_expiry, 
t1.med_barcode, 
t1.med_tablet, 
t1.med_pill, 
t1.med_received,
sum(t2.given_quantity) as given_pills,
t1.med_tablet - ((ifnull(sum(t2.given_quantity),0)*t1.med_tablet)/t1.med_pill) as still_tablets,
(t1.med_pill-sum(t2.given_quantity)) as still_pills
FROM med_pharmacy t1
LEFT JOIN consultation_med t2 USING (med_pharmacy_id,clinic_id)
LEFT JOIN medication t3 USING (med_id,clinic_id)
WHERE t1.clinic_id=:cid GROUP BY t1.med_pharmacy_id, t1.med_expiry,t1.med_barcode,t1.med_tablet,t1.med_pill,t1.med_received

我不是百分之百,但这应该有帮助......我们所做的是根据clinic_id从T1中选择全部。然后,我们连接其他表中的数据(如果存在)。

为了更好地解释查询,我首先从主查询中取出了2个额外的表。这将给我们留下我们诊所的初始库存。使用LEFT JOIN是添加额外信息的正确方法&#34;到主查询。这意味着即使其他表中没有信息,相关行也不会被忽略,它在相应的字段中只有NULL(这就是为什么我添加了IFNULL语句,意思是0而不是)。 LEFT JOIN需要2个主要信息,应该加入的表以及如何确定哪一行。

此处我们使用USING关键字进行加入。这很有用,因为这两个表共享相同的列名。这通常会告诉MySQL根据这些列的值连接第二个表中的行。如果表不共享列名,或者所需的操作不是纯粹的等号,我们可以使用ON代替。在此之后,我们应该像在WHERE子句中那样编写条件。

我建议您在自己喜欢的数据库手册中阅读有关JOINS的更多信息。

答案 1 :(得分:0)

"SELECT t1.med_id, t1.med_pharmacy_id,
t3.med_name,
t1.med_expiry, 
t1.med_barcode, 
t1.med_tablet, 
t1.med_pill, 
t1.med_received,
sum(t2.given_quantity) as given_pills,
t1.med_tablet - ((sum(t2.given_quantity)*t1.med_tablet)/t1.med_pill) as still_tablets,
(t1.med_pill-sum(t2.given_quantity)) as still_pills
FROM med_pharmacy t1, consultation_med t2, medication t3 WHERE t1.med_pharmacy_id = t2.med_pharmacy_id AND t1.med_id=t3.med_id
AND t1.clinic_id=:cid GROUP BY t1.med_pharmacy_id, t1.med_expiry,t1.med_barcode,t1.med_tablet,t1.med_pill,t1.med_received limit 1";