2017-05-29 73 views
2

該數據庫是視頻租賃商店的一個非常基本的概念。數據庫使用PHP(以及HTML,CSS,bootstrap等)顯示。SQL/PHP如何使用LEFT JOIN進行過濾?

我有表:

tl_dvd:持有的關於dvd,時間日期,名字,語言的基本信息等

tl_dvd

tl_order:其中包含租用電影的人的姓名和開始日期。

tl_order

tl_client:這不是我的問題/問題確實有關,而只是持有客戶的名字和姓氏。

當我在訂單頁面上時,它顯示當前正在運行的所有訂單。我有一列tl_orderreturned與在0代表未歸還1代表返回一個TINYINT。

有一個按鈕,說:「terug gebracht」(=英語「收回」),將所選擇的順序設置爲1 的tl_order只顯示尚未返回的訂單(0 returned集)。在SQL查詢我設置類似... AND returned = 0';

這裏到底是哪裏我應該使用LEFT (OUTER?) JOIN的一部分。如果一個訂單沒有回來(所以這意味着returned仍然在0tl_order)dvd不應該出現在我的tl_dvd(想想它就好像我們只有一個dvd副本爲每部電影)。我在tl_dvd嘗試這些LEFT JOIN S:

'SELECT * FROM tl_dvd LEFT JOIN tl_order WHERE tl_order.returned = 1'; 

打破我的頁面500錯誤。

'SELECT * FROM tl_dvd LEFT JOIN tl_order ON tl_order.returned = 1'; 

不給我一個錯誤,但修建垃圾每部影片像3倍。

有人可以解釋我如何解決這個問題或我做錯了什麼?

+1

當聯接表,你」即使不顯示2個表格的字段,每個組合的2個表格也會得到一行。嘗試從兩個表中選擇,瞭解我的意思。您錯過了ON子句以在JOIN中關聯ID。 – arvymetal

+0

目前還不清楚你想要輸出什麼。請閱讀[mcve]並採取行動。請儘可能使用文字。在這裏,而不是圖像;格式表中的代碼塊。 PS你說「該DVD不應該出現在我的tl_dvd」,但你不是說,在*輸出*? (看我的答案。) – philipxy

回答

0

您的查詢存在的問題是您沒有指定表格應該如何結合(加入哪些列),因此它將從兩個表格返回的所有內容

試試這個:

select 
    * 
from 
    tl_dvd left join tl_order on (tl_dvd.titel=tl_order.titel) 
where 
    tl_order.returned = 1 
0

你不解釋清楚,或給你想要在你的查詢結果是什麼一個例子。但是從你的例子,你可能想

SELECT * FROM tl_dvd 
LEFT JOIN tl_order 
ON tl_dvd.titel = tl_order.titel 
WHERE tl_order.returned = 1 

OUTER JOIN沒有上沒有標準的SQL,但MySQL的治療不存在於內部和外部的JOIN像ON 1=1,這在任何情況下相當於CROSS JOIN。

但它似乎並不像你真的想要LEFT JOIN而不是(INNER)JOIN。 LEFT JOIN返回(INNER)JOIN行以及由空值擴展的不匹配的左錶行。因此,除了每個DVD訂單的一行外,您還可以爲每個訂購的DVD獲取行,訂單信息爲空。由於「如果訂單不回來,DVD不應顯示」似乎是說你不想要那些額外的行。你會希望上面沒有「左」的或相同(但不太清楚)

SELECT * FROM tl_dvd 
CROSS JOIN tl_order 
WHERE tl_dvd.titel = tl_order.titel 
AND tl_order.returned = 1 
0

您可能要重寫查詢到用戶內加入類似下面的

SELECT * FROM tl_dvd INNER JOIN tl_order ON 
tl_dvd.id=tl_order.id //replace the id with the id you would like to join 
WHERE tl_order.returned = 1