2013-07-24 52 views
0

我想从表称为address_contact我用的是代码的最后ID#3个表中选择行的比较快的方式是:使用相同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) 

但是必须有一个更简单/更快的方法来做到这一点?

+0

您是否尝试过使用[子查询](http://stackoverflow.com/questions/14824780/basic-sql-sub-query)? – Blazemonger

+1

第一件事:在新的应用程序中使用'mysqli'而不是'mysql',它将被弃用。第二点:看一下SQL注入,在插入之前检查'$ id'(至少在它周围放置单引号''“。$ id。”'')。 – Pieter

+0

如果您的查询正在工作,并且速度不慢,那么您没有理由查看其他内容。查询对我来说很好。 – Maximus2012

回答

0

您可以使用子查询来查找ID一个SQL语句做到这一点。

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 
) 
+1

这样做会改变查询的含义从上次更新到最后一次插入。说明虽然不是很清楚,但可能是提问者想要的。 –

+0

啊,你是对的。修正了答案,谢谢你的指针 – Geoffrey

+0

对不起,太麻烦了,但afaik没有MySQL版本会允许子查询限制:) –

2

如果这个ID是你只插入一个全新的纪录,你应该使用msyql_last_insert_id()功能,保证您获得最后插入这个特定的脚本/数据库手柄一样。你的方法受制于种族条件 - 如果某个OTHER脚本在这个脚本的后面插入了一个插入,你将得到该脚本的ID,而不是你的。

话虽这么说,你会更好做

SELECT MAX(ID)FROM yourtable

,而不是由/限制版本的订货。这样做效率更高。

的基本代码序列是:

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

有时记录只是被编辑,所以它并不总是一个新的记录,所以这就是为什么我使用(日期/时间)'lastUpdate'字段和限制1获得最后一个? – msvuze

0

为什么不使用单一查询

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 
+0

这样做会很慢,因为您将排序所有连接表的数据,子查询将会大大加快。 – Geoffrey

+0

@Geoffrey我怀疑即使是MySQL限定优化器也会重写单行连接的限制,但我会尽可能进行基准测试。 –

+0

@JoachimIsaksson有兴趣查看结果,因为经常改变这样的查询,根据我的经验,按照一定数量级的顺序改进了性能,尤其是在较旧的MySQL版本中。 – Geoffrey