sql,加入两个表

时间:2010-07-11 12:57:01

标签: sql mysql

SELECT user.login,book.name     来自用户     LEFT JOIN书ON     user.login = book.author     在哪里user.login ='peter'

现在我明白了:

peter book1
peter book2
peter book2

我希望得到:

peter book1
      book2
      book2

数据库:MySQL 感谢

6 个答案:

答案 0 :(得分:3)

你不能这样做......

第2册有作者,为什么会显示空白?

为什么您希望输出完全如此?可能有更好的方法来做你需要的东西,如果你解释得更好,我们可能会有所帮助。

: - )

答案 1 :(得分:3)

应将SQL请求的每一行视为一个独立的行。你想要输出的方式意味着book2和book3没有作者(这不是真的)。​​

由于您不想在作者列中重复数据,并且此列始终相同,因此无法打印此列

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

你会得到

book1
book2
book2

答案 2 :(得分: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)

在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

这是你需要的吗?

答案 4 :(得分:0)

我已将此视为最终用户不希望重复列值的常见请求。

您没有指定您正在使用的数据库,因此我将提供Oracle答案。

您可以使用LAG函数检查LAG值是否等于当前值,如果是,则将其替换为NULL。

答案 5 :(得分:0)

这取决于数据库的结构方式以及数据库中实际保存的数据。从查询的外观来看,我不确定您希望的结果是否可行。

我认为问题在于您从用户表中选择user.login,这将始终存在,因为如果不存在,查询将根本不返回任何结果(即,连接取决于用户。包含记录的登录)。即使您尝试使用其他JOIN方法,我认为您将始终返回user.login。如果您尝试更改查询以便查找book.author,则会产生相同的效果,因为查询依赖于user.login和book.author相同的事实。

很有可能是那些对SQL有更多经验的人可以给出答案,但据我所知,这个名字将永远被退回。

也许如果你对其他事情有所了解,我们或许可以提出另一种选择。

TL; DR:因为user.login和book.author是相同的,所以无法获得所需的结果。