2015-01-10 41 views
1


依然讓我的腦袋圍繞着SQL。
SQL/PDO查詢優化

此刻我正在使用2個PDO查詢。什麼我試圖做的範圍如下:
- 首先我需要一個name轉換爲表ID
- 然後使用這個ID,得到其companyID匹配檢索表ID

於是百姓目前我有:(PS我知道有PDO速記,我只是不使用他們在這個項目大氣壓保持在所有PHP腳本一致性)

$prep = $DBH->prepare("SELECT Company.id FROM Company WHERE Company.name = :companyName LIMIT 1"); 
$prep->bindParam(":companyName", $_GET['companyName']); 
$prep->execute(); 
$data = $prep->fetch(); 
$companyID = $data['id']; 

$prep = $DBH->prepare("SELECT People.* FROM People WHERE People.companyID = :companyID"); 
$prep->bindParam(":companyID",$companyID); 
$prep->execute(); 

我的印象中,我將能夠在使用某種JOIN - 可能是INNER JOIN能夠在單個查詢中執行此操作。

這可能嗎? - 如果是的話,一個例子將非常感謝!

謝謝!

回答

2

是的,這是SQL 102

你需要這個查詢:

SELECT People.* 
    FROM Company 
    JOIN People ON People.companyID = Company.id 
    WHERE Company.name = :companyName 
    ORDER BY People.Surname, People.Givename 

我猜列在ORDER BY子句的列名中。但是這將在單個查詢中產生與:companyName相關的所有人員。這是有效的。 SQL是爲此而做的。

+0

非常感謝! – Zze

+0

對不起,但只是爲了澄清..即使說有多個連接,WHERE語句必須始終在最外面的「括號級別」上? (希望是有道理的) – Zze

1

這是我的一個特別的偏見,但我喜歡使用子選擇。這應該工作:

SELECT People.* FROM People 
    WHERE People.companyID IN 
    (SELECT Company.id FROM Company WHERE Company.name = :companyName LIMIT 1) 

但是,這也可以工作:

-- Aliasing is optional 
SELECT P.* FROM People AS P 
    JOIN Company C ON (P.companyID = c.id) 
    WHERE C.name = :companyName