在MySQL中获取2个表的交集

时间:2014-12-15 12:03:46

标签: mysql sql database

    Id   MedId  ShipId  AvailableQuant  DefaultQuant  MinQuant  MedExpiry                       LastUsed  
------  ------  ------  --------------  ------------  --------  -------------------  ---------------------
 1       1    2918              20            30        15  2015-02-05 11:37:24    2014-12-01 11:37:32
 4       2    2918              50            55        30  2015-03-26 11:57:14    2014-12-03 11:57:22
 5       3    2918              15            40        20  2014-12-10 16:58:58    2014-12-10 16:59:02
 6       4    2918              30            75        30  2015-03-31 11:58:26    2014-12-03 11:58:32
 7       5    2918              22            50        20  2015-01-01 11:59:05    2014-12-03 11:59:09
 9       6    3095               5            35        10  2014-12-03 11:59:51    2014-09-01 11:59:55
10       7    2918              30            60        35  2014-12-01 12:00:43    2014-10-22 12:00:57
11       8    3095              25            30        20  2014-12-31 17:48:58    2014-12-01 17:49:12

我写了2个查询

1)给我一些关键项目

SELECT  SUM(IF(m.AvailableQuant <= m.MinQuant,1, 0)) AS criticalFROM tbl_vesselmaster vs
INNER JOIN comp_login cl ON vs.co_id = cl.id
INNER JOIN m_shipinv m ON vs.id = m.ShipId
WHERE vs.co_id=$co_id;

2)给我药物的有效期限

SELECT COUNT(MedId) as count FROM `m_shipinv` WHERE DATE(MedExpiry) < DATE(NOW());

我想要一个查询来获取这两个查询的计数交集。意味着如果该项目是关键的并且其药物已过期则应该仅计数1

这应该是输出

count
-------
4

2 个答案:

答案 0 :(得分:0)

我认为你可以在第一个查询中添加where子句:

SELECT SUM(m.AvailableQuant <= m.MinQuant) AS critical
FROM tbl_vesselmaster vs INNER JOIN
     comp_login cl
     ON vs.co_id = cl.id INNER JOIN
     m_shipinv m
     ON vs.id = m.ShipId
WHERE vs.co_id = $co_id OR DATE(MedExpiry) < DATE(NOW());

请注意,我简化了SUM()计算。不需要if,因为MySQL将布尔值视为数值上下文中的整数。

答案 1 :(得分:0)

你能不能把这两个条件放在where子句中? 我不理解你所有的内部联接,因为你只描述了一个表。我刚刚改变了Gordon Linoff的选择:

SELECT count(*) AS critical
FROM tbl_vesselmaster vs 
       INNER JOIN comp_login cl ON vs.co_id = cl.id 
       INNER JOIN m_shipinv m   ON vs.id = m.ShipId
WHERE vs.co_id = $co_id 
  AND DATE(MedExpiry) < DATE(NOW())
  AND m.availableQuant <= m.minQuant;

我认为结果应为3:只有记录5,9和10符合这两个标准。