使用单个sql语句检查cat和subCat是否存在于两个不同的表中

时间:2013-05-03 10:18:17

标签: mysql sql pdo

我有两张桌子......

#mainCats
catId | catName
----------------
1     | Furniture
2     | Cutlery

#subCats
subCatId | subCatName | catId | catName 
-------------------------------------
1     | Tables        | 1     | Furniture
2     | Chairs        | 1     | Furniture
3     | Knives        | 2     | Cutlery

将项目添加到第三个表 - 项目时,我需要检查是否存在有效的类别和子类别。

现在数据的输入方式如下:

http://www.example.com/additem/?cat=1&sub=2&add=Table_Lamps

它的完成方式就是这样。 这只是一个简单的例子。

1st:
Select count(catId) as hasCat from mainCats where catId=1
if(hasCat == 1)
{

Select count(subCatId) as hasSubCat from subCats where subCatId=2 and catId=1;
if(hasSubCat == 1)
{
 //Do the adding to the table here

}else{
 echo 'A subCategory was not found';
} 


}else{
 echo 'A category was not found';
} 

是否有一种很好的方法来检查cat和subcat是否只存在于一个步骤中而不是所有这些代码中。

这件事来自1998年的旧网站。

2 个答案:

答案 0 :(得分:0)

如果您可以接受提供更为通用的错误消息,例如Category or subcategory not found,则可以跳过第一个选择。您甚至可以跳过这两个选择:假设第三个表具有指向catId和subcatId的外键,您可以执行插入而不进行任何检查,捕获异常以了解是否缺少cat或subcat。

如果你需要区分这两个错误情况,你可以在第一个选择之前执行第二个选择:如果第二个选择成功,你不需要执行第一个,如果第二个选择失败(没有类别)你执行第一个以了解是否至少存在主类别。通过这种方式,假设在大多数情况下存在类别,则可以避免50%的查询。同样,您也可以执行插入而不进行任何检查,捕获异常并执行第一个选择以了解是否至少存在主类别。通过这种方式,您可以避免几乎所有查询,但仍然可以区分这两种错误情况。

当然,我假设你的目标是减少查询以提高效率,而不是删除一些代码。

答案 1 :(得分:0)

也许你想要这个:

SELECT COUNT(mc.catId) AS hasCat COUNT(subCatId) AS hasSubCat FROM mainCats mc
LEFT JOIN subCats
WHERE subCatId=2 AND catId=1;

如果您在两个表中或两个表中都没有匹配的行,或者mainCats中有匹配的行,但subCats中没有匹配的行,那么这将使您工作。

第三个选项(subCats中的行但不在mainCats中)将不会显示此查询。

如果 MySQL FULL OUTER JOIN,您可以在一个查询中获得所有四个选项。

有趣的是, Microsoft SQL Server FULL OUTER JOIN,而 Oracle MySQL 则没有。

我首先学习了Microsoft SQL Server,然后我参加了一门讲授Oracle的大学课程。当我们了解了联接时,教授只解释了CROSSINNERLEFTRIGHT。所以我问了FULL加入,她问我为什么需要它。我在工作中给了她几个例子,我使用了FULL join,她坚持认为这只是糟糕的数据库设计......

然后我自己做了一些研究,并惊讶地发现Oracle没有完全加入。当我开始使用MySQL时,我只是有点失望,但发现它没有完全连接也没有震惊。