2016-09-15 99 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 
相关问题