2014-01-07 58 views
0

我有一個查詢:檢查內部(嵌套)MySQL查詢返回的值

SELECT 1 FROM block_list WHERE client=123 

其嵌套

SELECT * FROM products 
WHERE (client=123 AND product=234) 
    AND 1 <> (SELECT 1 FROM block_list WHERE client=123) 

它的工作原理(圓形其他方式)之內,如果我<>=取代。但是如果用戶在阻止列表中,我希望它返回NO記錄。阻止是暫時的,隻影響網站的某些部分。

是否有檢查嵌套查詢返回的方法沒有結果在WHERE子句內嗎?

+1

是的,有一種方法。 「不存在」。用'AND NOT EXISTS(SELECT ...)'替換'AND 1 <>(SELECT ...)' –

回答

2
SELECT * 
FROM products 
WHERE 
    client=123 
    AND product=234 
    AND NOT EXISTS (SELECT 1 FROM block_list WHERE client=123) 
2

試試這個:

SELECT 
    * 
FROM 
    products 
WHERE 
    client = 123 AND 
    product = 234 AND (
     SELECT 1 
     FROM block_list 
     WHERE client = 123 
     LIMIT 1 
    ) IS NULL 
0

對於可讀性/可維護性,我建議前分裂block_list查詢到自己單獨的查詢選擇的產品。沒有理由過度複雜化這樣的單個查詢的邏輯。

如果客戶端在阻止列表中,那麼您的原始查詢設計是不會返回結果的。爲什麼即使執行查詢?

$rs = $dbh->query('SELECT * FROM block_list WHERE client = 123'); 
if($rs->rowcount() == 0) { 
    $rs = $dbh->query('SELECT * FROM products WHERE client = 123 AND product = 234'); 
    // more code! 
} 
1

這看起來就像是一個參加了良好的應用:

SELECT DISTINCT p.* FROM products p 
JOIN block_list b USING (client) 
WHERE b.client=123 AND p.product=234