2013-04-11 18 views
1

比方說,我創建3個表如下...不是所有的數據從MySQL查詢回來

create table `users` (`username` varchar(20), `other_non_relevant_field` varchar(20)); 
insert into `users` values 
("Bob","blah blah blah"), 
("Steve","blah blah blah"), 
("Sue","blah blah blah"), 
("Adam","blah blah blah"); 


create table `table_1` (`username` varchar(20), `field_abc` varchar(20), `field_def` varchar(20), `other_non_relevant_field` varchar(20)); 
insert into `table_1` values 
("Steve","blue","brown","blah blah blah"), 
("Sue","yellow","brown","blah blah blah"), 
("Sue","pink","brown","blah blah blah"), 
("Adam","green","brown","blah blah blah"); 


create table `table_2` (`username` varchar(20), `field_ghi` varchar(20), `field_jkl` varchar(20), `other_non_relevant_field` varchar(20)); 
insert into `table_2` values 
("Bob","spoon","fork","blah blah blah"), 
("Bob","knife","spork","blah blah blah"), 
("Steve","spoon","knife","blah blah blah"), 
("Sue","spoon","fork","blah blah blah"), 
("Sue","knife","spork","blah blah blah"), 
("Adam","fork","knife","blah blah blah"); 

,然後我運行此查詢...

SELECT users.username, 
    table_1.field_abc, table_1.field_def, 
    table_2.field_ghi, table_2.field_jkl 
FROM users 
JOIN table_1 ON table_1.username = users.username 
JOIN table_2 ON table_2.username = users.username 
WHERE 
    table_1.field_abc REGEXP "(spork|pink)" OR 
    table_1.field_def REGEXP "(spork|pink)" OR 
    table_2.field_ghi REGEXP "(spork|pink)" OR 
    table_2.field_jkl REGEXP "(spork|pink)" 
ORDER BY 
(
    (CASE WHEN table_1.field_abc LIKE "%spork%" THEN 1 ELSE 0 END) + 
    (CASE WHEN table_1.field_abc LIKE "%pink%" THEN 1 ELSE 0 END) + 
    (CASE WHEN table_1.field_def LIKE "%spork%" THEN 1 ELSE 0 END) + 
    (CASE WHEN table_1.field_def LIKE "%pink%" THEN 1 ELSE 0 END) + 
    (CASE WHEN table_2.field_ghi LIKE "%spork%" THEN 1 ELSE 0 END) + 
    (CASE WHEN table_2.field_ghi LIKE "%pink%" THEN 1 ELSE 0 END) + 
    (CASE WHEN table_2.field_jkl LIKE "%spork%" THEN 1 ELSE 0 END) + 
    (CASE WHEN table_2.field_jkl LIKE "%pink%" THEN 1 ELSE 0 END) 
)DESC; 

爲何不返回鮑勃的條目中有「spork」嗎? 你可以看到這個查詢在行動http://sqlfiddle.com/#!2/cbbda/5

不言而喻,這不是我的實際代碼,但它是相似的,有相同的問題,我可以找出我的問題。

+0

可能需要更改您的JOIN類型 – 2013-04-11 20:41:15

回答

3

由於默認JOININNER,查詢不會返回表格返回NULL的結果。使用LEFT JOIN將返回「Bob」行,包括NULL值。

http://sqlfiddle.com/#!2/cbbda/7/0

下面是各種連接類型的視覺表示: http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

SELECT users.username, 
    table_1.field_abc, table_1.field_def, 
    table_2.field_ghi, table_2.field_jkl 
FROM users 
LEFT JOIN table_1 ON table_1.username = users.username 
LEFT JOIN table_2 ON table_2.username = users.username 
WHERE 
    table_1.field_abc REGEXP "(spork|pink)" OR 
    table_1.field_def REGEXP "(spork|pink)" OR 
    table_2.field_ghi REGEXP "(spork|pink)" OR 
    table_2.field_jkl REGEXP "(spork|pink)" 
ORDER BY 
(
    (CASE WHEN table_1.field_abc LIKE "%spork%" THEN 1 ELSE 0 END) + 
    (CASE WHEN table_1.field_abc LIKE "%pink%" THEN 1 ELSE 0 END) + 
    (CASE WHEN table_1.field_def LIKE "%spork%" THEN 1 ELSE 0 END) + 
    (CASE WHEN table_1.field_def LIKE "%pink%" THEN 1 ELSE 0 END) + 
    (CASE WHEN table_2.field_ghi LIKE "%spork%" THEN 1 ELSE 0 END) + 
    (CASE WHEN table_2.field_ghi LIKE "%pink%" THEN 1 ELSE 0 END) + 
    (CASE WHEN table_2.field_jkl LIKE "%spork%" THEN 1 ELSE 0 END) + 
    (CASE WHEN table_2.field_jkl LIKE "%pink%" THEN 1 ELSE 0 END) 
)DESC; 
+0

好的......我得到它不是'JOIN',因爲默認爲'INNER JOIN',但我仍在閱讀並試圖圍繞我的頭爲什麼正確的答案是' LEFT JOIN'而不是'OUTER JOIN' – 2013-04-11 20:53:42

+0

只是爲了踢我嘗試將它改爲「黃色」和「spork」,如http://sqlfiddle.com/#!2/cbbda/10所示,並讓Sue返回了3次。它必須是由於連接的工作原理,但只有2條實際記錄與Sue的「黃色」或「spork」匹配。在我的實際代碼中,我將添加'GROUP BY users.username',所以實際上我只會爲每個用戶返回一條記錄,但如果我仍然有問題,我只是好奇而已。無論如何,額外的結果會影響大型數據庫的性能嗎? – 2013-04-11 21:01:57

2

因爲Bob是不存在於TABLE_1元件,並且JOIN不具有在匹配行的行丟棄所有連接的表格。

爲了達到您想要的效果,請在兩次出現中將JOIN改爲LEFT JOIN。通過這種方式,您可以將所有'用戶'元素與table_1和table_2元素進行匹配,如果找不到匹配項,則會將其添加到null。

相關問題