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
仍在0
中tl_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 次垃圾邮件。
谁能解释我如何解决这个问题或我做错了什么?
【问题讨论】:
在连接表格时,即使您不显示 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 一个表并根据条件过滤其数组元素