2017-05-29 69 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