2011-07-14 127 views
3

我有一个MySQL连接查询效果很好(免责声明:从教程中获得)忽略在MySQL空结果JOIN查询

<?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,但不确定从哪里开始。

回答

1
SELECT * FROM buyers LEFT JOIN products USING (id) WHERE products.id IS NOT NULL 

OR

SELECT * FROM buyers JOIN products USING (id) 

使用JOIN不仅带来匹配的行,其中作为LEFT JOIN将所有购房者无论在产品中发现任何匹配的,之后过滤记录。我并不完全了解你的情况,但对我来说,使用JOIN而不是LEFT JOIN

+0

谢谢,但如果我有两个值 - products.id和product_name列 - 我只是得到“错误查询数据库”消息。 – avenas8808

+0

好吧,您应该只在必要时执行LEFT JOIN,因为查询优化器无法优化它们(顺序对于LEFT JOIN很重要)。所以你应该用第二个查询 – wonk0

+0

@ avenas8808来代替使用'或die(mysql_error())',它会输出准确的错误。 –

1

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

在这种情况下,您要寻找的是INNER JOIN,如果它在其他中有匹配,只会显示值。

+0

如果某个产品已停产,我已将该列作为NULL - 数据库具有由其构成的副本,这是一个测试副本。 – avenas8808

0

如果你想忽略空结果,那么只需使用INNER JOIN,你不需要LEFT JOIN
查询更改为:

SELECT * FROM buyers JOIN products USING (id) 
+0

谢谢!所有的SQL查询都起作用。问题解决了! – avenas8808

2

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

无论如何,如果你有空的ID,因此,没有结果的产品,你可以只还添加

where products.id is not null 

或者,你可以改变连接左加入到刚刚加入,使其内部联接