2015-09-26 119 views
0

我有不同類型的訂單加入很多表有一個選擇

  • 表orderA

    IDA的一些表 - INT,idCustomer - INT,propertieA1 - 字符串,propertieA2 - 詮釋 ...

  • 表orderB

    idB前 - INT,idCustomer - INT,propertieB1 - 真正的,propertieB2 - INT ...

  • 表orderC

    IDC - INT,idCustomer - INT,propertieC1 - 字符串,propertieC2 - 串...

,並通知客戶的表

  • 表客戶

    idCustomer - int,name string,address - string ...

現在我想選擇特定客戶的所有訂單。我該怎麼做? 我認爲做一個選擇是這樣的:

SELECT * FROM customer 
INNER JOIN orderA ON orderA.idCustomer = customer.idCustomer 
INNER JOIN orderB ON orderB.idCustomer = customer.idCustomer 
INNER JOIN orderC ON orderC.idCustomer = customer.idCustomer 
WHERE customer.idCustomer = 235 

但它給我所有的「orderA」與第一個「oredrB」,一個又全部「orderA」第二個「orderB」,等等。

因此,如果他有100個orderA,100個orderB和100個orderC - resulf是100 * 100 * 100行 - 300個行300萬行!

我該如何解決? (我可以改變表的結構,如果有必要)

感謝

+1

你能分享一些樣本數據和你試圖得到的結果嗎? – Mureinik

+0

在orderA客戶買了一個筆記本 - 字符串是公司的名稱和int是大小。在order B中,顧客購買了一張海報 - 實際尺寸以cm爲單位,而int則是指數。在oredrC他買了一本書 - 字符串是書的名字和作者的名字。結果將會是 - 零售商沒有。 235購買了5本筆記本電腦,12張海報和2本書,其中有詳細信息 –

+0

@chmouelkalifa。 。 。你有一個荒謬的數據結構。一個'orders'表應該有一個'productid'參考另一個表,並提供有關產品的信息。產品可以具有常用信息,例如名稱和供應商以及專用列,如果它們未在數據庫中使用,則可以將其存儲爲JSON對象。 –

回答

0

如果你可以改變表的結構。 。 。那就做吧!將所有訂單放入一個表中,即使您有NULL列,因爲這些值不適用。

如果你想要在一個表中的所有訂單,那麼你需要仔細選擇列,並使用union all。一般結構爲:

SELECT * 
FROM customer c INNER JOIN 
    ((SELECT idCustomer, col1, col2, . . . 
     FROM orderA 
    ) UNION ALL 
     (SELECT idCustomer, col1, col2, . . . 
     FROM orderB 
    ) UNION ALL 
     (SELECT idCustomer, col1, col2, . . . 
     FROM orderC 
    ) 
    ) o 
    ON o.idCustomer = c.idCustomer 
WHERE c.idCustomer = 235; 

你需要決定你想要的列,並確保每個子查詢對列(即使該值是NULL)的值。

+0

感謝您的答案。我認爲你的語法有問題。沒有?所以我不清楚。 –

+0

@chmouelkalifa。 。 。該查詢是一個模板。有幾個明顯的缺陷,但它應該做你想做的。 –

+0

好的。我想我明白了。謝謝。 –

相關問題