繁体   English   中英

SQL / PHP如何使用LEFT JOIN进行过滤?

[英]SQL/PHP How can I filter this with the use of a LEFT JOIN?

该数据库是视频租赁商店的非常基本的概念。 使用PHP(和HTML,CSS,引导程序等)显示数据库。

我有三个表:

tl_dvd :包含有关dvd,持续时间日期,名称,语言等的基本信息。

tl_dvd

tl_order :其中包含租借电影的人的姓名和开始日期。

tl_order

tl_client :与我的问题无关,只是保留客户的名字和姓氏。

当我在订单页面上时,它将显示当前正在运行的所有订单。 我称一列returnedtl_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM