2010-07-11 156 views
0

SELECT user.login,book.name 從用戶 LEFT JOIN書 user.login = book.author WHERE user.login = '彼得'SQL,連接兩個表

現在我得到:

peter book1 
peter book2 
peter book2 

卜祝得到:

peter book1 
     book2 
     book2 

數據庫:MySQL的 感謝

+0

有彼得書面書2嗎? book2是否有作者? book2的作者與彼得不同嗎?需要更多信息。 – 2010-07-11 13:00:55

+0

也許發佈來自兩個表格的示例數據。 – 2010-07-11 13:02:40

回答

3

我同意與其他人一樣,雖然這是可以在SQL中執行的事情,但確實應該不是

以下假定可以有每本書只有一個作者,這是不是在現實的情況下:

SELECT x.author, 
     x.book_name 
    FROM (SELECT CASE 
       WHEN @author != u.login THEN u.login 
       ELSE '' 
       END AS author, 
       b.name AS book_name, 
       @author := u.login AS set_variable 
      FROM USER u 
    LEFT JOIN BOOK b ON b.author = u.login 
      JOIN (SELECT @author := '') r 
     WHERE u.login = 'peter' 
     ORDER BY u.login) x 

它使用一個變量(只MySQL支持這一點,據我所知)存儲筆者/登錄值。 CASE表達式設置爲返回列值,如果它不匹配變量中當前存儲的值。如果變量和列值匹配,則零長度字符串將佔用列值 - 如果您願意,可以將其更改爲NULL。

我包括一個ORDER BY,因爲如果沒有ORDER BY,沒有辦法保證數據的順序。

我不得不使用子查詢,否則,變量被設置的列將出現在結果集中。

3

你不能這樣做......

書2有一個作者,爲什麼它會顯示一個空白?

爲什麼你想要你的輸出是這樣的?有可能有更好的方法來做你所需要的,如果你更好地解釋它,我們可能會提供幫助。

:-)

+0

我不想不必要地複製相同的數據。我使用Mysql數據庫 – user319854 2010-07-11 13:09:51

+1

@gloris - 然後不要在前端顯示它。查詢不會給你重複的信息。 – Donnie 2010-07-11 13:15:41

+0

@Gloris - 我同意唐尼在這一個。用戶界面應該是你將「不必要的重複數據」放在視野之外的地方。 – HarveySaayman 2010-07-11 13:18:34

0

我看這是從不想重複列值的最終用戶的共同要求。

你沒有指定你正在使用的數據庫,所以我會提供一個Oracle的答案。

您可以使用LAG函數來檢查LAG值是否等於當前值,如果是,則將其替換爲NULL。

+0

你需要示例代碼。 – 2010-07-11 17:21:42

+0

男人,我很想念Oracle PLSQL。要小心,有些人會因爲提供不適用於給定數據庫的答案而給你留下好印象。但您可以在MySQL中模擬LEAD/LAG功能 - 請參閱此鏈接瞭解詳情:http://explainextended.com/2009/03/10/analytic-functions-first_value-last_value-lead-lag/ – 2010-07-11 17:21:49

+0

是的 - 我一直爲適當的甲骨文解答 - 這有點讓我感到吃驚:)...但是在這種情況下,海報本來並沒有指定數據庫 - 儘管我現在看到它說的是mySQL ......無論如何,LAG技巧就像一個魅力有空的時候。 – Randy 2010-07-11 18:18:35

2

在MySQL中你可以做。

SELECT user.login, group_concat(book.name SEPARATOR '\n') AS book 
FROM user 
LEFT JOIN book ON 
user.login = book.author 
WHERE user.login = 'peter' 
GROUP BY user.login 

這是你需要的嗎?

+0

這不會使所有書籍都返回一行嗎? – Tim 2010-07-11 13:21:37

+0

@Tim - 是的。分隔一個新的行字符。 – 2010-07-11 13:22:41

+0

+1,因爲在給定請求的情況下,返回的行集似乎儘可能標準化。每行有一個作者和一些書籍。每行有一定數量的書有一位作者。鑑於這一要求,這很好。 – 2010-07-11 17:24:09

0

這取決於數據庫的結構以及數據庫中實際保存的數據。從查詢的外觀來看,我不確定你想要的結果是否可能。

我認爲問題在於,您正在從用戶表中選擇user.login,這將始終存在,因爲如果它不存在,查詢將根本不返回任何結果(即聯接取決於用戶.login包含一條記錄)。即使您嘗試使用其他JOIN方法,我認爲您將始終得到返回的user.login。如果您嘗試更改查詢以便您正在查找book.author,這將具有相同的效果,因爲查詢取決於user.login和book.author是相同的事實。

很可能有人對SQL有更多的經驗可以給出答案,但就我所知,這個名字總是會被返回。

也許如果您對發生的事情有所瞭解,我們可能會提出一個替代方案。

TL; DR:因爲user.login和book.author是相同的,所以不可能得到想要的結果。

3

SQL請求的每一行都應該看作獨立行。您希望輸出的方式意味着book2和book3沒有作者(這是不正確的)。

既然你不想在筆者列重複數據,該列是始終不變的,你無法打印此列

SELECT book.name 
FROM book 
WHERE user.login = 'peter' 

,你會得到

book1 
book2 
book2