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

Posted

技术标签:

【中文标题】SQL/PHP 如何使用 LEFT JOIN 过滤?【英文标题】:SQL/PHP How can I filter this with the use of a LEFT JOIN? 【发布时间】:2017-10-30 05:53:19 【问题描述】:

该数据库是视频租赁店的一个非常基本的概念。使用 php(以及 html、CSS、bootstrap 等)显示数据库。

我有三个表:

tl_dvd:其中包含有关 dvd、持续时间、名称、语言等的基本信息。

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

tl_client:这与我的问题/问题并不真正相关,但仅包含客户的名字和姓氏。

当我在订单页面上时,它会显示当前正在运行的所有订单。我在tl_order 中有一个名为returned 的列,其中0 代表未返回1 代表返回

有一个按钮,上面写着'terug gebracht'(='received back' in English)将选择的订单设置为 1。tl_order 只显示未返回的订单然而(returned 设置为 0)。 在 SQL 查询的末尾,我设置了类似 ... AND returned = 0';

这是我应该使用LEFT (OUTER?) JOIN 的部分。 如果订单未返回(这意味着returned 仍在0tl_order) dvd 不应该出现在我的tl_dvd 中(想想我们每部电影只有一个 dvd 副本)。我在tl_dvd 中尝试过这些LEFT JOINs:

'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 次垃圾邮件。

谁能解释我如何解决这个问题或我做错了什么?

【问题讨论】:

在连接表格时,即使您不显示 2 个表格的字段,您也会得到 2 个表格的每个组合的一行。尝试从两个表中进行选择以理解我的意思。您错过了关联 JOIN 中的 id 的 ON 子句。 不清楚你想要输出什么。请阅读minimal reproducible example 并采取行动。也请尽可能使用文本。在这里,而不是图像;在代码块中格式化表格。 PS 你说“dvd 不应该出现在我的 tl_dvd 中”,但你不是说在 输出 中吗? (见我的回答。) 【参考方案1】:

您的查询的问题在于您没有指定表的连接方式(要连接的列),因此它从两个表中返回所有内容

试试这个:

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

【讨论】:

【参考方案2】:

您没有在查询结果中清楚地解释或举例说明您想要什么。但是从你的例子中你可能想要

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 行加上由空值扩展的不匹配的左表行。因此,除了每个 dvd 订单的一行之外,您还会为每个订购的 dvd 获得一行,订单信息为空。因为“如果订单没有退回 [...] dvd 不应该出现”似乎是说你不想要那些额外的行。你想要上面没有'LEFT'或同等(但不太清楚)

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

【讨论】:

【参考方案3】:

您可能希望将查询重写为用户内部联接,如下所示

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

【讨论】:

以上是关于SQL/PHP 如何使用 LEFT JOIN 过滤?的主要内容,如果未能解决你的问题,请参考以下文章

从 LEFT JOIN 设置 NULL 列的默认值并使用 WHERE 过滤

深入Oracle的left join中on和where的区别详解

Bigquery:按 _PARTITIONTIME 过滤不会在 LEFT JOIN 上传播

BigQuery LEFT JOIN 一个表并根据条件过滤其数组元素

外连接left join 过滤条件选择是放on条件中还是where条件中

多表查询-inner join left join right joinfull join