簡體   English   中英

如何使WHERE子句僅適用於左連接中的右表?

[英]How can I make a WHERE clause only apply to the right table in a left join?

我有兩張桌子。

TableA: field_definitions
field_id, field_type, field_length, field_name, field_desc, display_order, field_section, active

TableB: user_data
response_id, user_id, field_id, user_response

我需要一個將返回表A中所有行的查詢,如果它們存在,則根據特定的user_id匹配表B中的行。

這是我到目前為止所擁有的......

SELECT field_definitions. * , user_data.user_response
FROM field_definitions
LEFT JOIN user_data
USING ( field_id ) 
WHERE (
user_data.user_id =8
OR user_data.user_id IS NULL
)
AND field_definitions.field_section =1
AND field_definitions.active =1
ORDER BY display_order ASC 

僅當表B在WHERE子句中具有零行或匹配的user_id行時,此方法才有效。 如果表B具有匹配的field_id而不是user_id的行,則返回零行。

實質上,一旦表B中的行存在於用戶X,查詢在搜索用戶Z響應時不再返回表A中的行,並且找不到任何行。

我需要結果始終包含表A中的行,即使B中沒有匹配的行與正確的user_id。

您可以將這些約束從WHERE子句移動到ON子句(首先要求您將USING子句更改為ON子句: ON子句比USING子句更靈活)。 所以:

SELECT field_definitions.*,
       user_data.user_response
  FROM field_definitions
  LEFT
  JOIN user_data
    ON user_data.field_id = field_definitions.field_id
   AND user_data.user_id = 8
 WHERE field_definitions.field_section = 1
   AND field_definitions.active = 1
 ORDER
    BY field_definitions.display_order ASC
;

從概念上講,首先執行連接,然后將where子句應用於虛擬結果集。 如果要首先過濾一個表,則必須將其編碼為連接內的子選擇。 這些方面的東西:

SELECT 
  field_definitions. * , 
  user8.user_response
FROM 
  field_definitions
    LEFT JOIN (select * from user_data where user_id=8 or user_id is null) as user8
    USING ( field_id ) 
WHERE
  field_definitions.field_section =1
  AND field_definitions.active =1
ORDER BY display_order ASC 

您可以按如下方式移動WHERE子句

SELECT field_definitions. * , user_data.user_response
FROM (
  select * from
  field_definitions
  WHERE field_definitions.field_section =1
  AND field_definitions.active =1 ) as field_definitions
LEFT JOIN (
  select * from
  user_data
  where user_data.user_id =8
  OR user_data.user_id IS NULL ) as user_data
USING ( field_id ) 
ORDER BY display_order ASC 

sepc的字面翻譯:

SELECT field_definitions. * , '{{MISSING}}' AS user_response
  FROM field_definitions 
UNION
SELECT field_definitions. * , user_data.user_response
  FROM field_definitions 
       NATURAL JOIN user_data
 WHERE user_data.user_id = 8;

但是,我懷疑你並不真的想要“表A中的所有行”。

暫無
暫無

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

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