2014-12-02 119 views
0

我想知道以下查詢之間的區別。兩者都返回相同的值。我有關於INNER JOIN的想法,但我無法理解第一個查詢返回相同的值。MYSQL select count with count condition and join

SELECT * 
FROM 
    `products` 
WHERE 
    (
    SELECT count(*) 
    FROM `categories` 
    WHERE `products`.`category_id` = `categories`.`id` AND `slug` = 'aprons' 
) >= 1 
    AND `slug` <> 'products-1' 

SELECT products.* 
FROM 
    products 
    INNER JOIN categories ON categories.id = products.category_id 
WHERE 
    products.slug <> 'products-1' 
    AND categories.slug = 'aprons' 
+0

第一個查詢幾乎肯定不會做你想要的。子查詢返回值不會更改返回的產品行,但更多的是開/關開關。 (ps感謝代碼重新格式化@Michael) – zanlok 2014-12-02 18:55:13

+0

第一個查詢是做一個子查詢來查看結果集中的任何類別是否有「圍裙」的段落,並且只返回那些值(sans-「products-1」 )。第二個是做同樣的過濾器,但作爲一個整體,只記錄與分類表相關的記錄,並沒有一條「圍裙」。本質上,他們正在做同樣的過濾器,但方式不同。但是'INNER JOIN'查詢更具性能,因爲它不必爲每條記錄運行一個子查詢。 – Siyual 2014-12-02 18:56:49

回答

0

第二個查詢效率更高。並使用內連接。第一個是使用子查詢。子查詢不需要驗證類別是否存在。顯示相同的結果,但是在優化點上,第二查詢更有效。

思維所述第一查詢

時( SELECT COUNT(*) FROM categories WHERE productscategory_id = categoriesid AND slug = '圍裙' )> = 1

這部分是執行每一個產品記錄。產品表中的每個記錄都會迭代簡單的類別。

-1

第一個查詢會更有效,因爲表不會需要連接。您可能沒有注意到執行時間有很大差異,但是如果表格大得多,您會注意到第一個查詢返回的速度要快得多。

內連接將基於兩個表中具有值的行組合兩個表。換句話說,結果表中不會有任何空值。

+0

對不起,但我不同意你的第一個觀點,對每條記錄使用子查詢比使用JOIN更有效,a)不必遍歷每一條記錄以這種方式記錄,並且b)被優化爲地獄和背部,因爲它完全是*它打算做的事情。 – Siyual 2014-12-02 19:00:19

+0

我想我應該在回答之前做更多的研究。但是,根據我對Oracle的經驗,我注意到在大型未排序的未過濾的表上,子查詢通常會勝出。 – nLee 2014-12-02 19:10:10

+0

我在執行第一個查詢時感到困惑,因爲我單獨執行子查詢並將值返回爲3.然後我將返回的值替換爲子查詢的位置。但結果與舊查詢不同。 – 2014-12-02 19:16:42