2009-09-25 40 views
0

這是很難解釋的選擇,但我需要多個在一個聲明中

- select id from customers 
- foreach customer find the order with that id 
-- foreach order (for that customer) 
--- select product.name, product.max on order.productId=product.id 

我不知道如何來拉這個數據。我需要多個單獨的選擇?我可以寫一個長的單個sql語句(';'算作單獨的:P)。我怎麼拉,從一排子行......

+1

我會嘗試連接,但給予一定的表的模式,所以我們會知道 – 2009-09-25 16:42:31

回答

4

使用聯接:

SELECT c.id, o.id, p.name, p.max 
    FROM Customers AS c 
     JOIN Orders AS o ON c.id = o.customer 
     JOIN Product AS p ON o.productID = p.id 

更有可能的是,你有一個Orders表和表的OrderItems - 只需添加與JOIN的一個額外水平適當的條件。

請注意,我假設您的表格是'訂單'以避免與關鍵字'訂單'衝突。我沒有假設您從MAX函數中消除了Product.Max的歧義。您可能不得不擔心您的DBMS允許的內容(有些容忍濫用關鍵字;有些則不適用)。


一個寬容的(過度寬容)DBMS是IBM Informix Dynamic Server的(IDS):

CREATE TABLE table(null INTEGER, integer CHAR(3), date DECIMAL(10,0), decimal DATE); 

它的工作原理 - 這是可怕的。但它避免了稍後添加的關鍵字帶來的許多問題。

+0

所有SQL數據庫允許使用的關鍵詞作爲標識符,如果你在分隔符,這是按標準雙引號,或背括起來在MySQL中,或MS SQL Server中的方括號。 – 2009-09-25 16:49:30

+0

是 - 同意(理論上)。 IDS允許CREATE TABLE語句寫入(不是雙引號),並且需要調整(在客戶端環境中設置的環境變量)以接受分隔標識符。這是現實世界的變幻莫測。 (IDS的前身產品允許雙引號等同於單引號 - 大約是SQL-86標準化的時間;我不確定是SQL-86還是SQL-89或SQL-92標準化分隔標識符,但是由於原因向後兼容性......)。 – 2009-09-25 22:05:50

0

您將在單個複合查詢中得到的結果是一對多關係單端的重複字段值。所以,如果富:酒吧:: 1:大量然後根據查詢得到所有的酒吧和他們的FOOS返回類似:

foo1 bar1 
foo1 bar2 
foo1 bar3 
foo2 bar4 
foo2 bar17 
foo3 bar78 

如果在其他表巴茲那就是酒吧地址:巴茲:: 1:地段,那麼你得到這樣的東西:

foo1 bar1 baz1 
foo1 bar1 baz2 
foo1 bar1 baz3 
foo1 bar2 baz15 
foo1 bar3 baz32 
foo1 bar3 baz33 
foo2 bar4 baz17 
foo2 bar17 baz21 
foo3 bar78 baz7 

這正是SQL應該做的。但是當你試圖以一種漂亮的格式輸出答案時,它會出現一些問題。這就是您的應用程序代碼的來源。設置一個與foo字段相同的$持有者,並檢查每次通過循環時新foo是否與舊foo不同。與$ bar一樣。所以:

$fooholder=NULL; 
$barholder=NULL; 
foreach ($result as $row_array) { 
    if(empty($fooholder)) { 
    $fooholder=$row_array['foo']; 
    $barholder=$row_array['bar']; 
    } 

    if ($fooholder!=$row_array['foo']){ //new foo value, so next section 
    //output $row_array['foo'] since it's new 
    $fooholder=$row_array['foo']; 
    } 

    if ($barholder!=$row_array['bar']){ //new bar value, so next section 
    //output $row_array['bar'] since it's new 
    $barholder=$row_array['bar']; 
    } 

    //output $row_array['baz'] 

}