如何使用mysql中的where从2表中获取数据?

时间:2014-04-08 07:54:05

标签: mysql database

我正在为医疗中心建立一个数据库。在我的情况下,我需要使用2个表获取数据。我有两个名为ConsultationChanneling的表。在我的情况下,当患者放置新的通道时,它将自动添加到咨询表中。然后,当患者完成咨询时,该咨询记录将被删除。但是Channeling记录没有删除(根据商业案例)。我需要从Channeling表格中的 Not Existing Consultation记录中提取记录。我试过这个,

SELECT c.* FROM Channeling c, Consultation cn WHERE c.cid!=cn.cid

cidChanneling表的主键。它是Consultation的外键。当我使用此查询时,我有700多条记录。但在我的Channelin表中只有75条记录。我怎么能这样做可能吗?我正在使用mysql数据库。

提前致谢!

3 个答案:

答案 0 :(得分:0)

将您的查询视为由WHERE子句过滤的笛卡尔积。所以这就像获取75 x Consultation records count条记录,然后丢弃所有那些组合

c.cid=cn.cid

这就是为什么你获得的元素多于Channelin的元素。

要获得您想要的东西,您可以尝试:

SELECT c.* FROM Channeling c WHERE 0 = (SELECT COUNT(1) FROM Consultation cn WHERE cn.cid=c.cid);

或者:

SELECT c.* FROM Channeling c WHERE c.id NOT IN (SELECT DISTINCT cn.id FROM Consultation cn);

不一样:

选择具有不同ID的频道和咨询元素的所有组合

比:

选择通道中不存在的所有元素

答案 1 :(得分:0)

您选择每个可能的咨询和通道组合,然后过滤掉具有相同ID的组合。

尝试这样的事情:

SELECT * FROM Channeling WHERE cid NOT IN (SELECT cid FROM Consultation)

答案 2 :(得分:0)

您正在使用两个表的笛卡尔积,然后选择条件为c.cid=cn.cid的记录。您可以通过左连接两个表来完成此操作。这将返回所有通道记录,然后选择具有咨询的Id列为空的记录。喜欢这个

SELECT  c.*
FROM Channeling c
LEFT JOIN Consultation cn
ON c.cid = cn.cid 
WHERE cn.cid IS NULL