Php 在MySQL中编写子查询是一种很好的做法吗?

Php 在MySQL中编写子查询是一种很好的做法吗?,php,sql,mysql,database,query-optimization,Php,Sql,Mysql,Database,Query Optimization,我编写以下子查询是为了某个项目的特定目的: SELECT count(*) from table1 WHERE userB='$p' AND userA IN (SELECT userB FROM table1 WHERE userA='$row[username]') 我很好奇,这是在PHP中执行此操作时的最佳实践,还是应该采用传统的方法,首先获取子查询结果,然后计算记录?只要子查询不会导致性能下降,我认为最好只使用一个查询。它将最小化您必须编写和维护的代码,这几乎总是一件好

我编写以下子查询是为了某个项目的特定目的:

SELECT count(*) from table1 
WHERE userB='$p' AND userA IN 
  (SELECT userB FROM table1 
   WHERE userA='$row[username]')

我很好奇,这是在PHP中执行此操作时的最佳实践,还是应该采用传统的方法,首先获取子查询结果,然后计算记录?

只要子查询不会导致性能下降,我认为最好只使用一个查询。它将最小化您必须编写和维护的代码,这几乎总是一件好事

我很好奇,这是在PHP中执行此操作的最佳实践,还是应该采用传统的方法,首先获取子查询结果,然后计算记录

抛开PHP或存储过程holy war中的SQL查询不谈,减少对数据库的访问是最佳实践。有时间返回数据库&这是永远无法收回的,分离查询会有在查询之间更改数据的风险

查询本身可以优化吗?在本例中,可能是:

SELECT COUNT(*) 
  FROM TABLE t
  JOIN TABLE t2 ON t2.userB = t.userA
               AND t2.userA = '$row[username]'
 WHERE t.userB = '$p' 
如果您真的想确定查询性能,那么必须熟悉生成解释计划&解释输出以优化查询

什么是解释计划? MySQL解释计划显示了MySQL查询优化器如何决定运行SELECT语句,以便最好地访问请求的数据

如何生成解释计划? 在MySQL中,您只需将关键字explain添加到SELECT查询中,在
SELECT
关键字之前。即:

EXPLAIN SELECT COUNT(*)
          FROM TABLE t
          JOIN TABLE t2 ON t2.userB = t.userA
                       AND t2.userA = '$row[username]'
         WHERE t.userB = '$p'
可能应该在前面提到这一点,但您不想在PHP中运行它,因为它不会返回您查询的内容。使用任何SQLIDE,比如PHPMyAdmin/etc

我有我的解释计划,但这意味着什么?!
是阅读返回的每一列以及该列表示的内容的好地方。

一般来说,大多数数据库使用左连接(您的查询可以转换为左连接)比使用子查询执行得更好

我同意Ted的观点,左键连接会更快。而且它也更容易阅读。
也不要使用count(*),使用count(id)

值得注意的是,子查询仅在MySql 4.1及更高版本中可用。
虽然理想情况下每个人都应该在MySql 5上,但有些用户仍然坚持使用他们的主机提供的服务(我已经被这个问题困扰了好几次)。

一般来说都会加入,但也有来自OMG Ponies的CaveatSexplane SELECT*+1.