0

我有两张桌子...

#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 年的旧网站。

4

2 回答 2

0

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

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

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

于 2013-05-03T10:35:29.700 回答
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

第三个选项(row insubCats但不是 in mainCats)不会随此查询显示。

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

有趣的是,Microsoft SQL ServerFULL OUTER JOIN,而OracleMySQL没有。

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

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

于 2013-05-03T13:43:59.740 回答