-2

我有这三个单独的查询,这是它们的伪版本:

SELECT packageid from tblhosting where userid=1234 AND id=4351
SELECT id FROM tblcustomfields WHERE relid =tblhosting.packageid AND fieldname ='foo'
SELECT value FROM  `tblcustomfieldsvalues` WHERE  `fieldid` =tblcustomfields.id AND relid=tblhosting.id

目前,这些是单独的查询,它们显示为每个查询的子查询。将它们组合成单个查询是否有意义?如果是,那么为什么以及如何将其结合起来?

4

2 回答 2

1

抱歉有点密集,但您的问题似乎没有使用子查询。

如果真正的代码使用子查询,沿着

SELECT value 
FROM  `tblcustomfieldsvalues` 
WHERE  `fieldid` = 
   (SELECT id 
   FROM tblcustomfields 
   WHERE relid =(
     SELECT packageid 
     from tblhosting 
     where userid=1234 
     AND id=4351)
 AND fieldname ='foo')
AND relid=tblhosting.id

那么您只需将其与@Chopin 的版本进行比较,就可以看到从可读性的角度来看,连接要好得多。

连接也是执行此操作的惯用方式——大多数 SQL 开发人员在研究基于子查询的方法时会摸不着头脑;这使得它的可维护性和可扩展性降低。

在性能方面,我猜查询优化器会认识到它们是等价的。“更好”的版本可能没有任何改进。

于 2012-06-21T13:30:04.630 回答
0

查询可能是这样的:

SELECT value FROM tblcustomfieldsvalues
INNER JOIN tblcustomfields ON tblcustomfields.id = tblcustomfieldsvalues.fieldid
INNER JOIN tblhosting ON tblhosting.packageid = tblcustomfields.relid
WHERE tblcustomfields.fieldname = 'foo' AND tblhosting.userid = 1234 AND tblhosting.id = 4351

在这里你加入tblcustomfieldsvaluestblcustomfields最后加入tblhosting。查看ON条件以确保它们正确连接。

最后,将该WHERE子句应用于您要约束的属性。

希望这可以帮助!

于 2012-06-21T13:16:14.603 回答