2011-07-14 162 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 

或者,你可以改變連接左加入到剛剛加入,使其內部聯接