簡體   English   中英

SQL - 組合查詢

[英]SQL - Combining Queries

我有兩個完全按照我想要的查詢,但是,我想嘗試將它們組合起來。

查詢1:

SELECT DISTINCT categories.id FROM categories 
    INNER JOIN product_categories 
        ON product_categories.category_id=categories.id 
    INNER JOIN products 
        ON product_categories.product_id=products.id 
    WHERE 
        categories.is_sub_cat='1' AND 
        categories.is_paused!='1' AND 
        products.nexus='1'

查詢2:

SELECT DISTINCT categories.top_cat FROM categories 
    INNER JOIN product_categories 
        ON product_categories.category_id=categories.id 
    INNER JOIN products 
        ON product_categories.product_id=products.id 
    WHERE 
        categories.top_cat!='0' AND 
        categories.is_paused!='1' AND 
        products.nexus='1'

是否可以將這些組合成1個查詢,或者我應該在完成兩個查詢之后將結果數組合並到PHP中?

您可以使用UNION合並兩個查詢

SELECT DISTINCT categories.id FROM categories 
    INNER JOIN product_categories 
        ON product_categories.category_id=categories.id 
    INNER JOIN products 
        ON product_categories.product_id=products.id 
    WHERE 
        categories.is_sub_cat='1' AND 
        categories.is_paused!='1' AND 
        products.nexus='1'
UNION 

SELECT DISTINCT categories.top_cat FROM categories 
    INNER JOIN product_categories 
        ON product_categories.category_id=categories.id 
    INNER JOIN products 
        ON product_categories.product_id=products.id 
    WHERE 
        categories.top_cat!='0' AND 
        categories.is_paused!='1' AND 
        products.nexus='1'

你可以用的時候用

SELECT case when (categories.is_sub_cat='1' AND  categories.is_paused!='1' AND 
        products.nexus='1') then categories.id
        else categories.top_cat end  as id
    FROM categories 
    INNER JOIN product_categories 
        ON product_categories.category_id=categories.id 
    INNER JOIN products 
        ON product_categories.product_id=products.id 

您可以將查詢組合為

SELECT DISTINCT categories.id, categories.top_cat FROM categories 
    INNER JOIN product_categories 
        ON product_categories.category_id=categories.id 
    INNER JOIN products 
        ON product_categories.product_id=products.id 
    WHERE 
        ( categories.is_sub_cat='1' OR categories.top_cat!='0' ) AND 
        categories.is_paused!='1' AND 
        products.nexus='1'

或者,如果列categories.idcategories.top_cat具有相同的數據類型,或者能夠轉換為相同的數據類型,則可以使用UNION ALL

是的,UNION似乎是一個合法的選擇。 對於你的情況,它應該沒關系,因為你是從同一個表中選擇,但作為旁注,你應該知道,當使用UNION時,你需要在表中具有相同數量的列(即如果它們不同)。

您可以使用WHERE子句中的條件執行此操作:

SELECT DISTINCT c.id
FROM categories c INNER JOIN
     product_categories pc
     ON pc.category_id = c.id INNER JOIN
     products p
     ON pc.product_id = p.id 
WHERE p.nexus = 1 AND
      c.is_paused <> 1 AND
      (c.is_sub_cat = 1 OR
       c.top_cat <> 0 
      );

注意:

  • 表別名使查詢更易於編寫和讀取。
  • 假設列是數字,請不要將值與字符串進行比較。 盡量避免類型轉換問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM