2013-07-24 49 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