Php 使用相同id从3个表中选择行的更快方法

Php 使用相同id从3个表中选择行的更快方法,php,mysql,sql,Php,Mysql,Sql,我正在尝试从名为address\u contact的表中获取最后一个ID,我使用的代码是: $result = mysql_query("SELECT id FROM address_contact ORDER BY lastUpdate DESC LIMIT 1") or die(mysql_error()); $row = mysql_fetch_array( $result ); $id = .$row['id']; 现在我想关闭该连接并打开一个新连接,然后使用我们刚刚获得的ID从

我正在尝试从名为address\u contact的表中获取最后一个ID,我使用的代码是:

$result = mysql_query("SELECT id FROM address_contact ORDER BY lastUpdate DESC LIMIT 1") 
or die(mysql_error());  
$row = mysql_fetch_array( $result );
$id = .$row['id'];
现在我想关闭该连接并打开一个新连接,然后使用我们刚刚获得的ID从以下3个表中获取所有数据:

Table 1: address_address
Table 2: address_contact
Table 3: address_email
所以看起来是这样的

$result = mysql_query("SELECT address_contact.id,address_contact.lastname,address_contact.firstname,address_contact.primaryAddType,address_address.id,address_address.phone1,address_address.phone2,address_address.line2,address_email.id,address_email.email
FROM address_address
LEFT JOIN address_contact ON address_address.id=address_contact.id 
LEFT JOIN address_email ON address_address.id=address_email.id                  
WHERE address_contact.id = ".$id)

但是必须有一种更简单/更快的方法来实现这一点?

如果此ID用于刚刚插入的全新记录,则应使用msyql_last_insert_ID函数,该函数确保您获得此特定脚本/数据库句柄的最后一次插入。您的方法受制于竞争条件n-如果其他脚本在该脚本的后面插入,您将获得该脚本的ID,而不是您的ID

话虽如此,你最好还是这样做

从表中选择maxid

而不是按订单/限制版本。这样做效率更高

基本代码顺序为:

INSERT INTO yourtable ....
SELECT @id := last_insert_id();
SELECT ... FROM yourtable WHERE id = @id;

您可以在单个SQL语句中使用子查询来查找ID

SELECT
  address_contact.id,
  address_contact.lastname,
  address_contact.firstname,
  address_contact.primaryAddType,
  address_address.id,
  address_address.phone1,
  address_address.phone2,
  address_address.line2,
  address_email.id,
  address_email.email
FROM
  address_address
  LEFT JOIN address_contact ON address_address.id = address_contact.id 
  LEFT JOIN address_email   ON address_address.id = address_email.id                  
  WHERE address_contact.id = (
    SELECT id FROM address_contact ORDER BY lastUpdate DESC LIMIT 1
  )

为什么不使用单一查询

SELECT address_contact.id,address_contact.lastname,address_contact.firstname,address_contact.primaryAddType,address_address.id,address_address.phone1,address_address.phone2,address_address.line2,address_email.id,address_email.email
FROM address_address
LEFT JOIN address_contact ON address_address.id=address_contact.id 
LEFT JOIN address_email ON address_address.id=address_email.id                  
ORDER BY address_contact.lastUpdate DESC 
LIMIT 1

你试过使用mysql吗?第一件事:在新的应用程序中使用mysql而不是mysql,它将被弃用。第二点:看一看SQL注入,在插入$id之前检查$id,至少在它的“$id.”周围加上单引号。如果您的查询正在运行且速度不慢,那么您就没有理由查看其他内容。我觉得这个问题不错。@Maximus2012我不同意。始终尝试优化您的代码-@Blazemonger我做了,但我太迷茫了,这让我头晕目眩:我的尝试太糟糕了,以至于我甚至没有把它包括在问题中。这根本不会改变查询从上次更新到上次插入的含义。虽然描述不是很清楚,但可能是询问者想要的。啊,你是对的。修复了答案,感谢指针,这让人很痛苦,但是afaik no MySQL版本将不允许子查询中的限制:这不是一个好答案,如果有人在您的insert和select之间插入另一行,那么您将得到错误的行@mavroprovato只要select是用于显示的,而不是与insert结合使用,我就看不出有什么问题。如果用户看到一行已过期1ms,我认为他/她不会注意到:这会很慢,因为您将对所有联接表的数据进行排序,子查询也会快得多。@Geoffrey我怀疑即使是MySQLs limited Optimizer也会将限制重写为一行联接,不过,我还是要做个基准测试。@JoachimIsaksson有兴趣看到结果,因为根据我的经验,经常更改这样的查询可以提高性能好几个数量级,尤其是在较旧的MySQL版本中。@Geoffrey是的,我绝对不会为MySQL的优化器找借口,但是运行查询检查是值得的:有时候记录只是被编辑过,所以它并不总是一个新记录,所以这就是为什么我使用日期/时间'lastUpdate'字段并限制1来获取最后一个?