![](/img/trans.png)
[英]How to use subquery in laravel and convert sql query to laravel
[英]Convert SQL query to a subquery
我知道奇怪的要求。 但是我的客戶比我換褲子更喜歡改變主意。 以下是我的SQL查詢的摘要:
SELECT C.f_Name, C.l_Name, O.order_No, O.order_Date
FROM Customers AS C, Orders AS O,
WHERE C.customer_ID = O.order_No
我想將其轉換為子查詢。 為什么? 因為我要向該查詢添加更多的噸,因此我迫切需要在子查詢的世界中起步。 我試圖這樣做:
SELECT C.f_Name, C.l_Name
FROM Customers AS C
WHERE C.customer_ID IN (SELECT O.order_No, O.order_Date FROM Orders AS O WHERE C.customer_ID = O.order_No)
但是我顯然不理解這個概念,因為它不起作用。 請幫我堆高車!
樣本數據集(非常小)
Customers Table
customer_ID | f_Name | l_Name
10 Akira Dawson
11 Charlie Frantooie
Orders Table
order_No | order_Date |
10 2014-04-11 09:04:36
通過這個小片段,Akira已下達命令,但Charlie尚未下訂單。 我正在使用PHP進行CSV導出,無論如何我都需要顯示所有記錄。 所以我的預期結果是
Customer_ID | f_Name | l_Name | order_No | order_Date
10 Akira Dawson 10 2014-04-11
11 Charlie Frantooie NA NA
ps C.customer_ID = O.order_No
是將客戶鏈接到訂單的內容
TL; DR來自@Turophile的答復
SELECT C.customer_ID, C.f_Name, C.l_Name, O.order_No, O.order_Date
FROM Customers AS C
LEFT OUTER JOIN Orders AS O
ON C.customer_ID = O.order_No
好,讓我分解一下您的榜樣,以期希望我能增加您的知識和了解。
SELECT C.f_Name, C.l_Name
FROM Customers AS C
WHERE C.customer_ID IN (
SELECT O.order_No, O.order_Date
FROM Orders AS O
WHERE C.customer_ID = O.order_No
)
這是一個開始,但您必須了解WHERE
子句中的子選擇不會為結果提供值-它僅限定了主選擇中包括哪些行。
請注意,您的WHERE
子句具有C.customer_ID IN
,這意味着子選擇必須返回一組customer_ID值。 現在,可以將它們稱為其他名稱,但必須是customer_ID
。 在您的示例中,您將返回O.order_No, O.order_Date
,這在兩種方式上都是錯誤的:首先,兩種方法似乎都不包含customer_ID
;其次,您將返回兩件事,這是O.order_No, O.order_Date
-您可以不能將單個客戶編號與具有兩列的列表匹配-考慮在程序代碼中執行此操作-您不能說int == (Object){int,int}
。
如果要在結果集中使用這些值,則需要在主(外部)查詢中選擇它們,因此它們需要以某種方式到達那里,這意味着子查詢可能不是答案-子查詢是WHERE
子句的一部分用於完善結果集,以排除一些不需要的數據。
嘗試這樣的事情:
SELECT C.f_Name, C.l_Name, order_No, O.order_Date
FROM Customers AS C
LEFT OUTER JOIN Orders AS O
ON C.customer_ID = O.customer_ID
但是如果您必須使用子選擇,並且假設您不需要返回訂單明細,請執行以下操作:
SELECT C.f_Name, C.l_Name
FROM Customers AS C
WHERE C.customer_ID IN (SELECT O.customer_ID FROM Orders)
還請注意,通常一個客戶可能有很多訂單,因此您必須允許這樣做。 希望對您有所幫助。 詢問是否需要。
編輯根據添加到問題的示例,我認為正確的查詢將是:
SELECT C.customer_ID, C.f_Name, C.l_Name, O.order_No, O.order_Date
FROM Customers AS C
LEFT OUTER JOIN Orders AS O
ON C.customer_ID = O.order_No
這是一個小提琴: http ://sqlfiddle.com/#!2/ ca441/1
請注意,在名為Order_No的列中有客戶編號是不好的-為什么它不是Customer_ID? 為了說明,目前沒有“訂單號”, order_No
列包含customer_ID
值。 客戶下多筆訂單會怎樣? 這是一個示例: http : //sqlfiddle.com/#!2/297e1/1 ,如您所見,每個客戶的所有訂單的“訂單號”都是相同的。 您的訂單表需要另外一列,添加了customer_ID
,然后order_No
可以是每個訂單的唯一鍵。 然后,這也很明顯,兩個表應該在customer_ID
上聯接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.