【问题标题】:SQL/PHP How can I filter this with the use of a LEFT JOIN?SQL/PHP 如何使用 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 中”,但你不是说在 输出 中吗? (见我的回答。)

标签: php mysql left-join inner-join outer-join


【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-16
        • 2014-08-06
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-24
        相关资源
        最近更新 更多