2016-09-15 95 views
1

我有這兩個表:如何爲每個帖子選擇作者的姓名?

// posts 
+----+---------+------------------------+-----------+------------+ 
| id | title |  content   | author_id | visibility | 
+----+---------+------------------------+-----------+------------+ 
| 1 | title1 | content1    | 3   | 1   | 
| 2 | title2 | content2    | 2   | 0   | 
+----+---------+------------------------+-----------+------------+ 

// users 
+----+---------+----------+ 
| id | fname | lname | 
+----+---------+----------+ 
| 1 | John | Tersco | 
| 2 | Peter | Brlew | 
| 3 | Jack | Keveinc | 
+----+---------+----------+ 

我想這是預期輸出:

+----+---------+------------------------+--------------+ 
| id | title |  content   | full_name | 
+----+---------+------------------------+--------------+ 
| 1 | title1 | content1    | Jack Keveinc |   
| 2 | title2 | content2    | Unknown  | 
+----+---------+------------------------+--------------+ 

這裏是我當前的查詢:

SELECT p.id, p.title, p.content, CONCAT(u.fname, ' ', u.lname) as full_name 
FROM posts p 
LEFT JOIN users u 
ON p.author_id = u.id AND p.visibility = 1 

正如你看到的,我需要的是定義當p.visibility等於0時爲。我怎樣才能做到這一點?

我需要CASECOALESCE或兩者嗎?


編輯:首先我要說的添Biegeleisen的答案是偉大的,所有的罰款。實際上,還有一列我需要像上面那樣對待它。但它沒有CONCAT功能。例如:

// users 
+----+---------+----------+------------+ 
| id | fname | lname | reputation | 
+----+---------+----------+------------+ 
| 1 | John | Tersco | 943  | 
| 2 | Peter | Brlew | 2300  | 
| 3 | Jack | Keveinc | 84   | 
+----+---------+----------+------------+ 

這是預期的結果:

+----+---------+------------------------+--------------+------------+ 
| id | title |  content   | full_name | reputation | 
+----+---------+------------------------+--------------+------------+ 
| 1 | title1 | content1    | Jack Keveinc | 84   | 
| 2 | title2 | content2    | Unknown  | N   | 
+----+---------+------------------------+--------------+------------+ 

好吧,我只想知道:還有我可以用COALESCEreputation列? (它沒有CONCAT

SELECT COALESECE(reputation, 'N') reputation, .... 

它是罰款?或者因爲它沒有CONCAT那麼我必須使用CASE呢?

回答

3

我相信下面的查詢是最好的方法,因爲它會顯示Unknownfull_name如果下列條件中的任爲真:

  • 一個帖子具有零知名度(visibility = 0
  • 帖子具有可見性,但不能與實際用戶作者匹配


使用你原來具有相同的連接條件,在這兩種情況下,加入了users表的第一個和最後一個名稱將是NULL,我們可以顯示Unknown

SELECT p.id, 
     p.title, 
     p.content, 
     COALESECE(CONCAT(u.fname, ' ', u.lname), 'Unknown') AS full_name 
FROM posts p 
LEFT JOIN users u 
    ON p.author_id = u.id AND 
     p.visibility = 1 

更新:

只需使用對所連接的姓氏和名字COALESCE就足夠了,因爲CONCAT回報NULL如果任何參數是NULL(劑適量的documentation)。

編輯:

如果您users表有所謂reputation另一列,那麼你也可以使用COALESCE(u.reputation, 'N')。原因是全部列從users表將爲NULLposts不匹配的記錄。

+0

最好的答案,這是最好的有'p.visibility = 1'在加入本身,所以你不包括所有行'p.visibility = 0' – DerpyNerd

+0

如果我刪除CASE,會發生什麼情況?我想這是多餘的。我的意思是使用COALESCE就夠了,不是嗎? –

+0

@MartinAJ你說得對,'COALESCE'就夠了。 –

1

案例做的工作:

SELECT p.id, p.title, p.content, case p.visibility when 0 then 'unknown' else CONCAT(u.fname, ' ', u.lname) end as full_name 
FROM posts p 
LEFT JOIN users u 
ON p.author_id = u.id 
1
SELECT p.id 
    , p.title 
    , p.content 
    , CASE p.visibility 
      WHEN 0 THEN 'Unknown' 
      ELSE CONCAT(u.fname, ' ', u.lname) 
     END AS full_name 
FROM posts p 
LEFT JOIN users u 
ON p.author_id = u.id AND p.visibility = 1 
1

您可以用CASE WHEN u.id IS NULL THEN 'unknown' ELSE CONCAT(u.fname, ' ', u.lname) END替換CONCAT(u.fname, ' ', u.lname)

1
SELECT p.id, p.title, p.content, case p.visibility when 0 then 'Unknown' else CONCAT(u.fname, ' ', u.lname) end as full_name 
FROM posts p 
LEFT JOIN users u 
ON p.author_id = u.id 
1

你必須使用情況的同時選擇列,

SELECT p.id, p.title, p.content,case when p.visibility=0 then 'Unknow' 
else CONCAT(u.fname, ' ', u.lanme) end as full_name 
FROM Posts p 
JOIN users u 
ON p.author_id = u.id 
相關問題