【问题标题】:Ignore null results in MySQL JOIN queries忽略 MySQL JOIN 查询中的空结果
【发布时间】:2011-07-15 06:49:12
【问题描述】:

我有一个运行良好的 MySQL 连接查询(免责声明:取自教程)

<?php
    $connection = mysql_connect("localhost", "root", "test") or die("Error connecting to database");
    mysql_select_db("products90", $connection);
    $result = mysql_query("SELECT * FROM buyers LEFT JOIN products USING (id);", $connection) or die("error querying database");
    $i = 0;
    while($result_ar = mysql_fetch_assoc($result)){
    ?>
    <table>
    <tr <?php if($i%2 == 1){ echo "class='body2'"; }else{echo "class='body1'";}?>>
    <td>
    <?php echo $result_ar['buyer_name']; ?></td>
    <td>
    <?php echo $result_ar['manufacturer']; ?>
    </td>
    <td>
    <?php echo $result_ar['product_name']; ?>
    </td>
    </tr>
    </table>
    <?php
    $i+=1;
    }
    ?>

但是,如果我希望它忽略 NULL 结果,我需要对 JOIN 做什么,哪种类型合适?

我查看了 Google,但不知道从哪里开始。

【问题讨论】:

    标签: php mysql join


    【解决方案1】:

    说你想忽略 NULL 结果你到底是什么意思?你是说当你的左连接执行时,你会得到一些买家,他们旁边是 NULL产品在哪里(他们买了一些)?

    在这种情况下,您正在寻找的是一个 INNER JOIN,它只有在另一个匹配时才会显示值

    【讨论】:

    • 如果产品停产,我将列设为 NULL - 数据库有一个副本,这是一个测试副本。
    【解决方案2】:

    当你说你有空结果时,你的意思是没有产品?

    无论如何,如果您的 ID 为空,因此没有结果,您也可以添加

    where products.id is not null
    

    或者,您可以将连接从左连接更改为仅连接,使其成为内部连接

    【讨论】:

      【解决方案3】:

      您将为此使用 INNER JOIN(如果我的问题正确)。

      有关 MySQL 中 JOIN 类型的概述,请参阅http://dev.mysql.com/doc/refman/5.1/en/join.html

      【讨论】:

      • 谢谢;那我可以试试这个的 INNER JOIN 查询是什么?
      • SELECT ... FROM Buyer INNER JOIN products USING (id)
      【解决方案4】:
      SELECT * FROM buyers LEFT JOIN products USING (id) WHERE products.id IS NOT NULL
      

      SELECT * FROM buyers JOIN products USING (id)
      

      使用JOIN 只会带来匹配的行,而LEFT JOIN 会带来所有买家,而不管在产品中找到任何匹配项,然后过滤记录。我不太确定您的情况,但对我来说,使用 JOIN 而不是 LEFT JOIN 似乎更简单

      【讨论】:

      • 谢谢,但如果我有两个值 - products.id 和 product_name 列 - 我只会收到“查询数据库错误”消息。
      • 好吧,你应该只在必要时进行 LEFT JOIN,因为查询优化器无法优化它们(顺序对于 LEFT JOIN 很重要)。所以你应该去第二个查询
      • @avenas8808 改用or die(mysql_error()),它会输出准确的错误。
      • @avenas8808 我认为您应该向我们展示您的两个表的数据库架构。在我看来,您在上面的评论中的产品表中没有外键。
      【解决方案5】:

      如果您想忽略空结果,只需使用INNER JOIN,您不需要LEFT JOIN
      将您的查询更改为:

      SELECT * FROM buyers JOIN products USING (id)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-27
        • 2011-12-22
        • 1970-01-01
        • 2019-08-21
        • 2016-09-10
        • 1970-01-01
        • 1970-01-01
        • 2011-12-02
        相关资源
        最近更新 更多