我有两张桌子......
#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年的旧网站。
答案 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的大学课程。当我们了解了联接时,教授只解释了CROSS
,INNER
,LEFT
和RIGHT
。所以我问了FULL
加入,她问我为什么需要它。我在工作中给了她几个例子,我使用了FULL join,她坚持认为这只是糟糕的数据库设计......
然后我自己做了一些研究,并惊讶地发现Oracle没有完全加入。当我开始使用MySQL时,我只是有点失望,但发现它没有完全连接也没有震惊。