【问题标题】:individual SQL select queries vs single big SQLselect query: what is better & why? [closed]单个 SQL 选择查询与单个大 SQLselect 查询:什么更好?为什么? [关闭]
【发布时间】:2012-06-21 12:52:37
【问题描述】:

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

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

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

【问题讨论】:

  • 取决于您实际想要的最终结果。
  • 我只想要第三次查询的结果
  • 这三个查询似乎彼此无关,因此将它们组合起来对我来说没有多大意义。
  • 您应该使用INNER JOIN 并进行更大的查询。
  • 您还应该提到它们目前显示为 SUB 查询。其实这还是没有意义的,只要给出你的实际查询...

标签: mysql sql query-optimization whmcs


【解决方案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 开发人员在研究基于子查询的方法时会摸不着头脑;这使得它的可维护性和可扩展性降低。

就性能而言,我猜查询优化器会识别出它们是等价的; “更好”的版本可能没有任何改进。

【讨论】:

  • 它说,'#1054 - 'where 子句'中的未知列'tblhosting.id'
  • 对于哪个查询 - 我的例子,或者肖邦的努力应该有效?
【解决方案2】:

查询可能是这样的:

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 子句应用于您要约束的属性。

希望这会有所帮助!

【讨论】:

  • 这可行,但由于某种原因,它返回多条记录,而不是 3 查询版本返回的单条记录
  • 也许我忘记了什么。尝试将AND tblcustomfieldsvalues.relid = tblhosting.id 添加到最后一个INNER JOIN 子句(据我了解你的版本,你有它)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
相关资源
最近更新 更多