[英]SQL/PHP How can I filter this with the use of a LEFT JOIN?
该数据库是视频租赁商店的非常基本的概念。 使用PHP(和HTML,CSS,引导程序等)显示数据库。
我有三个表:
tl_dvd :包含有关dvd,持续时间日期,名称,语言等的基本信息。
tl_order :其中包含租借电影的人的姓名和开始日期。
tl_client :与我的问题无关,只是保留客户的名字和姓氏。
当我在订单页面上时,它将显示当前正在运行的所有订单。 我称一列returned
在tl_order
与将TINYINT 0
代表不回来 , 1
代表返回 。
有一个按钮,上面写着“ terug gebracht ”(英文为“ received back”), 该按钮会将所选订单设置为1。tl_order仅显示尚未returned
的订单( returned
设置为0)。 在SQL查询的末尾,我设置了类似... AND returned = 0';
这是我应该使用LEFT (OUTER?) JOIN
。 如果没有下订单(则意味着tl_order
returned
值仍为0
),则DVD不应显示在我的tl_dvd
(想想它就像我们每部电影只有一个DVD副本)。 我已经在tl_dvd
尝试了这些LEFT JOIN
:
'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次垃圾邮件。
有人可以向我解释如何解决此问题或我做错了什么吗?
查询的问题在于,您没有指定如何联接表(要联接的列),因此它将返回两个表的所有内容 。
尝试这个:
select
*
from
tl_dvd left join tl_order on (tl_dvd.titel=tl_order.titel)
where
tl_order.returned = 1
您没有明确解释或给出查询结果中所需内容的示例。 但是从您的示例中,您可能想要
SELECT * FROM tl_dvd
LEFT JOIN tl_order
ON tl_dvd.titel = tl_order.titel
WHERE tl_order.returned = 1
不带ON的OUTER JOIN不是标准的SQL,但MySQL在INNER和OUTER JOIN中将缺少的ON视为ON 1=1
,这两种情况下都等同于CROSS JOIN。
但这似乎并不是您真正想要LEFT JOIN而不是(INNER)JOIN。 LEFT JOIN返回(INNER)JOIN行以及不匹配的左表行,这些行扩展为null。 因此,除了每条DVD订单的一行之外,您还获得了每张dvd dvd的一行,订单信息为null。 既然“如果订单还没有到,则dvd应该不会显示”似乎表明您不想要这些多余的行。 您希望上面没有'LEFT'或类似的内容(但不太清楚)
SELECT * FROM tl_dvd
CROSS JOIN tl_order
WHERE tl_dvd.titel = tl_order.titel
AND tl_order.returned = 1
您可能希望将查询重写为用户内部联接,如下所示
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.