簡體   English   中英

在左聯接中按多個值選擇

[英]Select by multiple values in left join

使用以下結構,如何在這種1:n關系中選擇多個條件的request子集?

# Table 1: Request
uid
name

# Table 2: Additional Information
uid
type
value
request

表2的注釋: type可以是任何值,即“ product_name”或“ rating”。

如果我只想選擇給定product_name請求,則可以執行以下操作:

SELECT * FROM request as r 
    LEFT JOIN additional_information as i 
    ON r.uid = i.request 
    WHERE i.type = 'product' AND i.value = 'Product Name'

如果我想按給定的product_name AND rating選擇Requests,那么我的語句必須是什么樣子。 我試圖簡單地添加另一個聯接,但這給了我所有與給定product_name相關的請求以及與給定評級相關的所有請求。 我需要聲明尊重兩個條件。

如上所述,這對我不起作用。

SELECT * FROM request as r 
    LEFT JOIN additional_information as i 
    ON r.uid = i.request
    LEFT JOIN additional_information as a 
    ON r.uid = a.request 
    WHERE i.type = 'product' AND i.value = 'Product Name' 
    OR a.type = 'rating' AND a.value = 1

感謝幫助!

將這些條件從WHERE移至JOIN ON條件,例如

SELECT * FROM request as r 
    LEFT JOIN additional_information as i 
    ON r.uid = i.request
    AND i.type = 'product' AND i.value = 'Product Name'    
    LEFT JOIN additional_information as a 
    ON r.uid = a.request 
    AND a.type = 'rating' AND a.value = 1;

而且絕對是的,考慮到Strwabery的有價值的評論(錯過了),而不是執行select *select r.* ,實際上您可能想要指定要獲取的列名,這比*性能上要好,因為您不是使用投影獲取不必要的數據; 除非您真的想獲取所有內容。

與其他產品相比,它可能會變慢,因為它已加入您的附加數據TWICE中,一次用於產品,再次進行評級。 可能應該將其更改為單個左連接,否則您可能會得到笛卡爾結果,從而使答案answer腫。

SELECT * 
   FROM 
      request as r 
         LEFT JOIN additional_information as i 
            ON r.uid = i.request
           AND (   ( i.type = 'product' AND i.value = 'Product Name' )
                OR ( i.type = 'rating' AND i.value = 1 );

暫無
暫無

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

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